首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像在OpenCV中乘以三倍,是什么原因造成的?

图像在OpenCV中乘以三倍,是什么原因造成的?
EN

Stack Overflow用户
提问于 2016-03-19 17:29:05
回答 2查看 570关注 0票数 2

我有一个灰度图像,这是一张照片的R通道,现在我试图把R通道写成一个新的图像,这是一个RGB图像。理想情况下,新图像看起来就像旧的图像,但是是红色的。

然而,在新的图像中,旧的图像出现了三次,互相挤压在一起。

在这里您可以看到灰度图像和输出图像。

下面是我的代码,我认为它非常简单:

代码语言:javascript
复制
  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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-19 17:55:54

问题在于:

代码语言:javascript
复制
img_out.at<Vec3b>(i,j)[2] = img_in.at<Vec3b>(i,j)[2];

正如您所说的,输入的图像是灰色的。所以,就用:

代码语言:javascript
复制
img_out.at<Vec3b>(i,j)[2] = img_in.at<unsigned char>(i,j);
票数 3
EN

Stack Overflow用户

发布于 2016-03-19 18:25:14

通过将图像加载为3通道并减去Scalar(255,255,0),您将得到相同的结果。

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36104827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档