Loop Through Image Pixels OpenCV - PullRequest
       7

Loop Through Image Pixels OpenCV

0 голосов
/ 01 декабря 2018

Я пытаюсь перебрать пиксели изображения cv :: Mat с помощью этого кода

for (int i = 0; i < src.rows;i++)
{
    for (int j = 0; j < src.cols;j++)
    {
        int temp2=IMAGE.at<uchar>(i,j)+b;

        if (temp2<0)
        {
            IMAGE.at<uchar>(i,j) = 0;
        }
        else if  (temp2>255)
        {
            IMAGE.at<uchar>(i,j) = 255;
        }
        else 
        {
            IMAGE.at<uchar>(i,j) = temp2;
        }

    }
}

Проблема в том, что, когда я показываю ИЗОБРАЖЕНИЕ, оно корректирует только значения пикселей примерно для 1/4 изображения.Таким образом, кажется, что он не проходит через каждый пиксель.Есть ли лучший способ перебрать каждый пиксель, используя строку / столбец?

1 Ответ

0 голосов
/ 01 декабря 2018

Цикл по строке / столбцу должен работать, но кажется, что изображение, которое вы пытаетесь обработать, имеет размер пикселя 4 байта, в то время как ваш код предполагает, что он равен 1 байту (uchar).Это объясняет, почему вы настраиваете только 1/4 изображения.Вы можете попробовать использовать cv :: Vec4b вместо uchar, возможно, наш CV_32SC1 (int).Оба имеют размер пикселя 4 байта вместо 1. Вы бы использовали cv :: Vec4b, если пиксели изображения задают красный, зеленый, синий, альфа и CV_32SC1, которые будут использоваться для 32-битной шкалы яркости.

Примеры:

// RGBA
cv::Vev4b temp2 = IMAGE.at<cv::Vec4b>(i,j);
temp2[0] += b;
temp2[1] += b;
temp2[2] += b;

или

// 32 Bit Grayscale
int temp2 = IMAGE.at<int>(i,j) + b;
...