我有一个灰度图像,这是一张照片的R通道,现在我试图把R通道写成一个新的图像,这是一个RGB图像。理想情况下,新图像看起来就像旧的图像,但是是红色的。
然而,在新的图像中,旧的图像出现了三次,互相挤压在一起。
在这里您可以看到灰度图像和输出图像。


下面是我的代码,我认为它非常简单:
Mat img_in = imread("in.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat img_out = Mat::zeros(img_in.size(), CV_8UC3);
for (int i = 0; i < img_in.rows; i++)
{
for (int j = 0; j < img_in.cols; j++)
{
img_out.at<Vec3b>(i,j)[2] = img_in.at<Vec3b>(i,j)[2];
}
}
imwrite("test_img_in.png", img_in);
imwrite("test_img_out.png", img_out);一开始我以为这是某种索引混淆,但我尝试了很多组合,它总是将输出图像水平地乘以三倍,而不是垂直的。
现在我的想法是,它来自于一些OpenCV规范,比如CV_8UC3类型(我也尝试过其他类型),我之所以选择它,是因为我认为它支持RGB映像。不幸的是,我对OpenCV本身不太了解,这就是我在这里寻求帮助的原因。
PS:这是一个更大程序的一部分,它想要从三个灰度通道图像中生成一个彩色图像,但是我现在仍然坚持合并对齐灰度图像,因为这种情况发生了。我发布的代码与程序的其他部分是隔离的,它的工作方式是这样的。
我的OpenCV版本是2.4.11。
发布于 2016-03-19 17:55:54
问题在于:
img_out.at<Vec3b>(i,j)[2] = img_in.at<Vec3b>(i,j)[2];正如您所说的,输入的图像是灰色的。所以,就用:
img_out.at<Vec3b>(i,j)[2] = img_in.at<unsigned char>(i,j);发布于 2016-03-19 18:25:14
通过将图像加载为3通道并减去Scalar(255,255,0),您将得到相同的结果。
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char **argv)
{
Mat src = imread(argv[1]);
imshow("src", src );
src -= Scalar(255,255,0);
imshow("Red channel", src );
waitKey();
return 0;
}https://stackoverflow.com/questions/36104827
复制相似问题