遍历图像像素OpenCV

时间:2018-12-01 03:02:34

标签: c++ loops opencv mat

我正在尝试使用此代码遍历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;
        }

    }
}

问题是当我显示IMAGE时,它仅调整图像大约1/4的像素值,因此似乎没有遍历每个像素。是否有更好的方法使用行/列遍历每个像素?

1 个答案:

答案 0 :(得分:0)

循环浏览行/列应该可以,但是似乎您要处理的图像的像素大小为4字节,而您的代码假定为1字节(uchar)。这可以解释为什么您仅调整图像的1/4。您可以尝试使用cv :: Vec4b代替uchar(也许是CV_32SC1(int))。这两个像素的大小均为4字节而不是1字节。如果图像像素指定红色,绿色,蓝色,alpha和CV_32SC1用于32位灰度,则应使用cv :: Vec4b。

示例:

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