在 C++ 中将 RGB 更改为 GrayScale

Change RGB to GrayScale in c++

我正在尝试使用平均法将 RGB 图像转换为灰度图像。但是 get 的输出与所需的输出不同。我正在拍摄图像并获取 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;
}

创建时Mat averaged_image,

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

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

您还可以使用函数 cvtColor:

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

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