如何遍历所有图像像素然后取灰度值,1通道进行分析?
Posted
技术标签:
【中文标题】如何遍历所有图像像素然后取灰度值,1通道进行分析?【英文标题】:How to loop through all image pixels then take gray scale value, 1 channel for analysis? 【发布时间】:2018-03-13 00:39:11 【问题描述】:我基本上想遍历灰度图像,获取单通道 (CV_8UC1) 值并对每个值进行分析,最终得到如下结果:
if (pixel.intensityVal >= 100 && pixel.intensityVal <= 150)
bitStream.add("1")
else if (pixel.intensityVal >= 175 && pixel.intensityVal <= 190)
bitStream.add("0")
else
bitStream.add("X")
然后最终将“bitStream”打印出来进行验证。
我是 OpenCV 和 C++ 的新手,但这似乎可行,我只是不确定最有效的方法。
任何建议将不胜感激!
【问题讨论】:
您的第二个if
语句似乎不正确 - 如果强度小于或等于 175,则必然小于 190。
最有效的方法可能是创建一个包含 51 个 1、16 个 0 和其余作为 X 的 255 元素数组,并调用 OpenCV 的 LUT()
函数。
啊,是的,那个 if 语句是一个错字。感谢您指出了这一点。我将研究 LUT() 函数。
【参考方案1】:
我首先考虑到你已经有了你的灰度图,否则你可以使用cvtColor( image, gray_image, CV_BGR2GRAY );
转换或者直接灰度上传(见下文)。
您的图像存储在cv::Mat
变量中,该变量是一个包含每个像素值的矩阵。因此,可以通过读取每个单元格来访问强度级别。为此,您可以使用运算符.at<type>(x,y)
。
cv::Mat img = cv::imread("lenna.png", IMREAD_GRAYSCALE);
for(int i=0; i<img.rows; i++)
for(int j=0; j<img.cols; j++)
pixel.IntensityVal = img.at<cv::CV_8UC>(i,j);
if (pixel.intensityVal >= 100 && pixel.intensityVal <= 150)
bitStream.add("1")
else if (pixel.intensityVal <= 175 && pixel.intensityVal <= 190)
bitStream.add("0")
else
bitStream.add("X")
有使用指针访问矩阵的最佳方法,但这不是问题的范围。
【讨论】:
完美!现在,如果我想将图像拆分为 32x32 网格,其中 (0,0) 是图像的左上角“框”,我将如何使用您的算法单独遍历每个框?例如:框 (0,0) 使用像素强度值条件进行测试,然后框 (0,1)...(n,m) 您应该先提出自己的解决方案,然后我们可以讨论改进。 所以根据我问的另一个问题,我被告知用这样的东西循环图像: int operator()(int y, int x) const int j = y * 32;整数 i = x * 32;自动 gridBlock = cv::Rect(i, j, 32, 32); int grayVal = gridBlock(i, j, CV_8UC1); int num_over_threshold = cv::countNonZero(buff);返回 num_over_threshold > count_threshold ? 255:0;但这是用于阈值处理,我需要取单通道灰度值。 我无法在主帖中更新我的完整代码,如果难以阅读,请见谅。 你应该可以编辑你的第一个问题并添加这部分代码以上是关于如何遍历所有图像像素然后取灰度值,1通道进行分析?的主要内容,如果未能解决你的问题,请参考以下文章