C++ 图像在OpenCV中被乘以三倍,这是什么原因?

C++ 图像在OpenCV中被乘以三倍,这是什么原因?,c++,opencv,image-processing,C++,Opencv,Image Processing,我有一个灰度图像,它只是一张照片的R通道,现在我试着把R通道写入一个新的图像,这是一个RGB图像。理想情况下,新图像看起来与旧图像一样,但为红色 然而,在新图像中,旧图像会出现三次相互挤压 在这里您可以看到灰度图像和输出图像 这是我的代码,我认为它非常简单: Mat img_in = imread("in.png", CV_LOAD_IMAGE_GRAYSCALE); Mat img_out = Mat::zeros(img_in.size(), CV_8UC3); for (i

我有一个灰度图像,它只是一张照片的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);
Mat img\u in=imread(“in.png”,CV\u LOAD\u IMAGE\u灰度);
Mat img_out=Mat::zeros(img_in.size(),CV_8UC3);
for(int i=0;i
起初我认为这是某种索引的混合,但我尝试了很多组合,它总是将输出图像水平相乘三倍,而不是垂直相乘

现在我的想法是它来自一些OpenCV规范,比如
CV_8UC3
类型(我也尝试过其他类型),我之所以选择它是因为我认为它支持RGB图像。不幸的是,我对OpenCV本身了解不多,这就是为什么我在这里寻求帮助

PS:这是一个更大的程序的一部分,它想从三个灰度通道图像生成一个彩色图像,但我目前一直在组合对齐的灰度图像,因为这会发生。我发布的代码与程序的其余部分隔离开来,并且独立运行。
我的OpenCV版本是2.4.11。

问题在于:

img_out.at<Vec3b>(i,j)[2] = img_in.at<Vec3b>(i,j)[2];
img_out.at(i,j)[2]=img_in.at(i,j)[2];
正如您所说,输入图像是灰色的。因此,只需使用:

img_out.at<Vec3b>(i,j)[2] = img_in.at<unsigned char>(i,j);
img_out.at(i,j)[2]=img_in.at(i,j);

将图像加载为3通道,然后减去标量(255255,0)

#包括
使用名称空间cv;
int main(int argc,字符**argv)
{
Mat src=imread(argv[1]);
imshow(“src”,src);
src-=标量(255255,0);
imshow(“红色通道”,src);
waitKey();
返回0;
}

有点离题,但是这个算法看起来会非常慢。为什么不使用或替代?或者转换和空白的B和G颜色平面。然而,这似乎有可能是一个问题的加载。你能展示那部分代码吗?try=img_in.at(i,j)instead@DanMašek我不能使用
合并
,因为其他频道图像的大小不同。我添加了加载代码部分,现在我将尝试这些建议,谢谢@Micka@CGuy好吧,现在很明显,正如迪姆赫茨所解释的。一般来说,我会避免这种每像素算法。库提供的函数都经过了很好的优化。谢谢@DimChtz,这解决了我的问题。我假设灰度图像没有
Vec3b
数组,这很有意义。@CGuy确切地说,它们只有一个通道。
#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;
}