我使用分割功能创建了3张灰度图像。现在我想重新生成彩色图像。 我尝试了以下代码,但它没有用。我得到的图像仍然是灰度图像。
cv::Mat R = cv::imread("/home/r/secret_R.png",0);
cv::Mat G = cv::imread("/home/r/secret_G.png",0);
cv::Mat B = cv::imread("/home/r/secret_B.png",0);
std::vector<cv::Mat> array_to_merge;
array_to_merge.push_back(R);
array_to_merge.push_back(G);
array_to_merge.push_back(B);
cv::Mat color;
cv::merge(array_to_merge, color);
然后我尝试了cvtColor函数:
cv::Mat color_converted;
cv::cvtColor(color, color_converted, CV_GRAY2BGR);
cv::imwrite("/home/r/color_secret.png",color_converted);
但显然,它仅适用于只有一个通道的源图像。我把它的一张灰度图像传给了它:
cv::cvtColor(R, color_converted, CV_GRAY2BGR);
但我仍然无法获得彩色图像。得到的图像仍为灰度
我做错了什么?如何恢复我的彩色图像?
答案 0 :(得分:13)
我看不出你的代码有什么问题。我怀疑它可能是源数据,或者它是如何被进口商处理的。加载图像后,是否可以打印出图像元数据以查看OpenCV正在读取的属性?它们都必须具有相同的尺寸和单一通道。
std::cout << "Red: " << R.size().width << " x " << R.size().height << " x " << R.channels() << std::endl;
std::cout << "Green: " << G.size().width << " x " << G.size().height << " x " << G.channels() << std::endl;
std::cout << "Blue: " << B.size().width << " x " << B.size().height << " x " << B.channels() << std::endl;
我刚刚运行了你的程序,只是添加了标题和主要内容。我做了一个小改动,合并为B,G,R顺序(默认)。我在Mac OS X 10.8上编译它:
g++ -o merge merge.cpp -lopencv_core -lopencv_highgui
针对OpenCV版本2.4.3。
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
int main(int argc, char* argv[])
{
cv::Mat R = cv::imread("chan_dest_red.png", 0);
cv::Mat G = cv::imread("chan_dest_green.png", 0);
cv::Mat B = cv::imread("chan_dest_blue.png", 0);
std::vector<cv::Mat> array_to_merge;
array_to_merge.push_back(B);
array_to_merge.push_back(G);
array_to_merge.push_back(R);
cv::Mat color;
cv::merge(array_to_merge, color);
imwrite("merged.png", color);
return 0;
}
我有一些来自另一个项目的单通道图像已经拆分成文件,我只是将它们合并为一个彩色图像,它工作得很好。源文件信息如下:
Red: 500 x 333 x 1
Green: 500 x 333 x 1
Blue: 500 x 333 x 1
答案 1 :(得分:1)
一种方法是使用 cvtColor 从一个通道创建彩色图像,然后使用 at 在循环中逐个像素地替换其他两种颜色功能。使用矩阵运算符可能有一种方法可以更轻松地完成此操作,但我对openCV不太熟悉,无法确切知道。