Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 保持亮度的图像重着色_Opencv_Image Processing - Fatal编程技术网

Opencv 保持亮度的图像重着色

Opencv 保持亮度的图像重着色,opencv,image-processing,Opencv,Image Processing,给定一个输入图像,我在考虑如何将图像重新着色为一种新的颜色,使图像的亮度与之前类似 所以我写了一段天真的代码: #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <bits/stdc++.h> using namespace cv; using namespac

给定一个输入图像,我在考虑如何将图像重新着色为一种新的颜色,使图像的亮度与之前类似
所以我写了一段天真的代码:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <bits/stdc++.h>
using namespace cv;
using namespace std;

int main() {
    Mat img = imread("test2.png", 1);
    Mat hsv; cvtColor(img, hsv, CV_BGR2HSV);    
    vector<Mat > channels;split(hsv, channels);
    Mat luminance; channels[2].copyTo(luminance);
    Mat res; img.copyTo(res);
    channels.clear(); split(res, channels);
    for (int i = 0; i<res.rows; i++) {
        for (int j = 0; j<res.cols; j++) {
            channels[0].at<uchar>(i, j) = 0;
            channels[1].at<uchar>(i, j) = 0; 
            channels[2].at<uchar>(i, j) = 255;
        }
    }
    merge(channels, res);
    cvtColor(res, hsv, CV_BGR2HSV);
    channels.clear(); split(hsv, channels);
    luminance.copyTo(channels[2]);
    merge(channels, res);
    cvtColor(res, res, CV_HSV2BGR);
    imwrite("result.png", res);
    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
int main(){
Mat img=imread(“test2.png”,1);
Mat hsv;CVT颜色(img、hsv、CV_BGR2HSV);
矢量通道;分割(hsv,通道);
Mat亮度;通道[2]。复制到(亮度);
材料;图像复制(res);
channels.clear();拆分(res,channels);

对于(int i=0;i我认为您正在寻找“着色”。我没有任何关于如何使用OpenCV进行着色的参考资料,但Anthony Thyssen出色的ImageMagick注释中有一个描述-搜索“不知何故”一词。如果效果符合您的要求,也许您可以将其调整为OpenCV

在命令行中,使用ImageMagick,我执行了以下操作:

convert drop.png -fill red -tint 50% result.jpg

这里是Imagemagick的另一种方式

convert \( input.png -colorspace gray \) \( -clone 0 -fill red -colorize 100 \) \( -clone 0 \) -compose colorize -composite result1.png


选择要使用的颜色空间表示的强度/亮度。请参阅我的脚本color2gray at,查看不同颜色空间的强度/亮度显示为灰色。

请附上输入图像以及当前结果。如果您可以使用一些图形编辑器并生成一些ws您的预期结果,并附上该结果。@DanMašek补充道:)
convert \( input.png -colorspace lab -channel red -separate \) \( -clone 0 -fill red -colorize 100 \) \( -clone 0 \) -compose colorize -composite result2.png
convert \( input.png -colorspace hsi -channel blue -separate \) \( -clone 0 -fill red -colorize 100 \) \( -clone 0 \) -compose colorize -composite result3.png