Измените RGB на GrayScale в C ++ - PullRequest
       36

Измените RGB на GrayScale в C ++

0 голосов
/ 24 февраля 2020

Я пытаюсь преобразовать RGB-изображение в оттенки серого, используя средний метод. Но результат get отличается от желаемого результата. Я беру изображение и получаю значения RGB. Я выполняю среднюю операцию и сохраняю усредненный и другой массив такого же размера изображения. Наконец я преобразовываю массив в Mat и отображаю изображение.

Входное изображение:

Input image

Желаемый вывод:

desired output

Мой вывод:

my output

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

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Вы также можете использовать функцию cvtColor:

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

Бонус: эта функция корректирует взвешивание каналов, потому что простое усреднение может быть неправильным.

0 голосов
/ 24 февраля 2020

При создании Mat averaged_image,

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

вам нужно использовать CV_32S, а не CV_8UC3, потому что ваш элемент массива не состоит из трех символов, это один 32-разрядный тип int.

...