检查灰度图像中的像素是不是为黑色(OpenCV)
Posted
技术标签:
【中文标题】检查灰度图像中的像素是不是为黑色(OpenCV)【英文标题】:Checking if a pixel is black in a grayscale image (OpenCV)检查灰度图像中的像素是否为黑色(OpenCV) 【发布时间】:2012-09-03 19:42:29 【问题描述】:我需要确定灰度图像上的任何给定像素是黑色还是白色,我在此之前通过了阈值算法。图像基本上变成白色背景上的黑色斑点。
Mat falsetest;
...
cv::cvtColor(detected_edges, falsetest, CV_BGR2GRAY);
threshold(falsetest, falsetest,128, 255,THRESH_BINARY);
...
printf("x:%d y:%d %d\n",x,y,falsetest.at<uchar>(x,y));
我预计结果是 0 或 255,但事实并非如此。不同像素的输出如下所示:
x:1259 y:175 111
x:1243 y:189 184
x:1229 y:969 203
x:293 y:619 255
x:1123 y:339 183
我是否试图以错误的方式执行此操作,或者似乎错误出在其他地方?
【问题讨论】:
很难为不完整的代码提供答案。您的错误可能出在您没有向我们展示的代码中。阅读:sscce.org 阈值化后,进行 imshow 时的 falsetest 是什么样的?只有黑白还是灰色?您提供的代码应该可以工作,您确定将其粘贴到此处时没有更改任何内容吗?我也很好奇 threshold 和 printf 之间是否有任何可疑之处 是的,图像看起来是黑白的。我不认为有任何可疑代码,但如果我不能自己解决这个问题,我会按照上面的建议用 ssccee 提出一个单独的问题。 【参考方案1】:您确定 falsetest
包含 uchar 像素,而不是浮点数吗?在这种情况下,您需要通过以下方式访问 falsetest
的值:
falsetest.at<float>(x,y)
【讨论】:
这会导致变化很大的数字,例如:-96.882393、-26077.882812、-nan、0.000000 等,但始终为负数。另外,为什么要浮动而不是 uchar?矩阵的什么属性定义了这一点?【参考方案2】:CV 代码看起来不错。但是,您在 printf 中使用 %d 来显示 uchar。
要么使用 %hhd 要么做
static_cast<int>(falsetest.at<uchar>(x,y)).
【讨论】:
确实,我有一个错误,但它仍然不能解释为什么图像中有完全不同的像素值。不应该只有两个吗? 好吧,我实际上猜测错误出现在显示中,而不是值本身。解释为 int 的 char 可能会导致意外结果。【参考方案3】:我终于弄清楚了问题所在。我打电话的时候还以为
cv::cvtColor(detected_edges, falsetest, CV_BGR2GRAY);
所有矩阵数据都被复制到 falsetest。然而,似乎并非如此,当我着手修改检测到的边缘时,错误测试也被污染了。克隆矩阵解决了这个问题。
【讨论】:
以上是关于检查灰度图像中的像素是不是为黑色(OpenCV)的主要内容,如果未能解决你的问题,请参考以下文章