循环通过图像像素 OpenCV

Posted

技术标签:

【中文标题】循环通过图像像素 OpenCV【英文标题】:Loop Through Image Pixels 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 遍历每个像素?

【问题讨论】:

我建议阅读以下帖子:learnopencv.com/parallel-pixel-access-in-opencv-using-foreach 这似乎重新发明了对 Mat 的标量饱和加法。为什么不只是 OpenCV 提供的现有优化实现? 【参考方案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;

【讨论】:

以上是关于循环通过图像像素 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 快速循环图像像素

opencv C++ 三重for循环遍历RGB图像像素(逐像素操作操作像素值遍历像素遍历)

OpenCVopencv3.0中的SVM训练 mnist 手写字体识别

OpenCV-Python实战——OpenCV简介与图像处理基础(万字总结,️建议收藏️)

python中音频图像识别和网页相关的库合集!

OpenCV修改图像像素[重复]