【问题标题】:Loop Through Image Pixels OpenCV循环通过图像像素 OpenCV
【发布时间】:2018-12-01 03:02:33
【问题描述】:

我正在尝试使用此代码循环遍历 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 的像素值,所以它似乎没有循环遍历每个像素。有没有更好的方法来使用 row/col 遍历每个像素?

【问题讨论】:

标签: c++ loops opencv mat


【解决方案1】:

使用 row/col 循环应该可以工作,但您尝试处理的图像的像素大小似乎为 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;

【讨论】:

    猜你喜欢
    • 2016-10-28
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    相关资源
    最近更新 更多