首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GrayScale中将RGB更改为c++

在GrayScale中将RGB更改为c++
EN

Stack Overflow用户
提问于 2020-02-24 14:05:59
回答 2查看 4.7K关注 0票数 0

我试图用平均法将RGB图像转换为灰度。但是get的输出与期望的输出不同。我拍了这张照片,得到了rgb值。我执行平均操作并存储图像大小相同的平均值和另一个数组。最后,我将数组转换为Mat并显示图像。

输入图像:

期望产出:

我的产出:

代码语言:javascript
复制
int main()
{
 Mat image;

 image =imread("<image_path>");

 int rows=image.rows;
 int cols=image.cols;

 int myArray[rows][cols];


 for (int i = 0; i < rows; i++) {
   for (int j = 0; j < cols; j++) {
     myArray[i][j] = 0;
   }
 }

 uint8_t* pixelPtr = (uint8_t*)image.data;

 int cn = image.channels();

 Scalar_<uint8_t> bgrPixel;

 for(int i = 0; i < rows; i++)

 {
     for(int j = 0; j < cols; j++)

     {
         bgrPixel.val[0] = pixelPtr[i*image.cols*cn + j*cn + 0]; // B

         bgrPixel.val[1] = pixelPtr[i*image.cols*cn + j*cn + 1]; // G

         bgrPixel.val[2] = pixelPtr[i*image.cols*cn + j*cn + 2]; // R

         int average = (bgrPixel.val[0]+bgrPixel.val[1]+bgrPixel.val[2])/3;

         myArray[i][j]=average;


     }

 }

 Mat averaged_image(Size(rows, cols), CV_8UC3, myArray, Mat::AUTO_STEP);

 imwrite("<path to save the image>",averaged_image);

 imshow("averaged_image",averaged_image);

 waitKey(0);

 return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-24 15:45:38

创建Mat averaged_image时,

代码语言:javascript
复制
 Mat averaged_image(Size(rows, cols), CV_8UC3, myArray, Mat::AUTO_STEP);

您需要使用CV_32S而不是CV_8UC3,因为数组元素不是三个字符,而是一个32位int。

票数 0
EN

Stack Overflow用户

发布于 2020-02-24 15:59:59

您还可以使用函数cvtColor

代码语言:javascript
复制
cv::Mat gray;
cv::cvtColor(image, gray, CV_BGR2GRAY);

额外好处:这个函数对信道进行了正确的加权,因为简单的平均可能不是正确的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60377598

复制
相关文章

相似问题

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