循环通过图像像素 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的主要内容,如果未能解决你的问题,请参考以下文章
opencv C++ 三重for循环遍历RGB图像像素(逐像素操作操作像素值遍历像素遍历)
OpenCVopencv3.0中的SVM训练 mnist 手写字体识别