【发布时间】:2017-07-03 02:55:16
【问题描述】:
给定一个输入图像,我在考虑如何将图像重新着色为一种新颜色,以保持图像的亮度与之前的相似。
于是我写了一段幼稚的代码:
#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;
}
我实际上只是提取了原始图像的亮度图,然后用我想要的颜色创建了一个图像,并将这个输出图像的亮度图替换为输入图像的亮度图。
但结果图像的阴影似乎更暗。有没有更好的方法来做到这一点?
输入图像:
结果图像:
【问题讨论】:
-
能否请您附上您的输入图像以及当前结果。如果您可以使用一些图形编辑器并生成一些显示您预期结果的图像并将其附上,那就太好了。
-
@DanMašek 添加:)