【问题标题】:Change RGB to GrayScale in c++在 C++ 中将 RGB 更改为灰度
【发布时间】:2020-02-24 23:59:59
【问题描述】:

我正在尝试使用平均方法将 RGB 图像转换为灰度。但是得到的输出与期望的输出不同。我正在拍摄图像并获取 rgb 值。我执行平均操作并存储图像的平均大小和另一个相同大小的数组。最后,我将数组转换为 Mat 并显示图像。

输入图片:

期望的输出:

我的输出:

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;
}

【问题讨论】:

  • 从技术上讲,您的代码不是有效的 C++,因为标准 C++ 没有 variable-length arrays。请改用std::vector
  • @Someprogrammerdude 即使在使用 for(int i=0;i(i,j);整数平均=(rgb_color.val[0]+rgb_color.val[1]+rgb_color.val[2])/3; myArray[i][j]=平均; } }
  • 尽管如此,在您的示例中使用非标准代码并没有帮助。如果有兴趣提供帮助的人没有带有 VLA 扩展的编译器,您可以将转换工作留给那个人。
  • 假设 OpenCV,averaged_imageMat constructor you use 可能会以与 pixelPtr 相同的方式期待图像数据:单个连续 字节数组 .
  • 并且您需要将输出数据的所有三个分量设置为平均颜色值。或者使用与 CV_8UC3 不同的格式,它需要三个颜色值(使用 CV_8UC1 代替只有一个颜色值)。

标签: c++ image-processing rgb grayscale


【解决方案1】:

创建Mat averaged_image时,

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

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

【讨论】:

  • 谢谢它的工作。我已将数组更改为 uint8_t 并在创建 Mat averaged_image 时将其更改为 CV_8U
【解决方案2】:

也可以使用cvtColor函数:

cv::Mat gray;
cv::cvtColor(image, gray, CV_BGR2GRAY);

奖励:此函数可以正确地对通道进行加权,因为简单的平均可能不是正确的做法。

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2011-06-05
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多