opencv中自适应阈值和正常阈值之间的区别
Posted
技术标签:
【中文标题】opencv中自适应阈值和正常阈值之间的区别【英文标题】:Difference between adaptive thresholding and normal thresholding in opencv 【发布时间】:2012-01-09 01:44:43 【问题描述】:我有这个灰色的视频流:
这张图片的直方图:
阈值图像:
threshold( image, image, 150, 255, CV_THRESH_BINARY );
我明白了:
我所期望的。
当我使用以下方法进行自适应阈值处理时:
adaptiveThreshold(image, image,255,ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY,15,-5);
我明白了:
这看起来像边缘检测而不是阈值。我所期望的是黑白区域。所以我的问题是,为什么这看起来像边缘检测而不是阈值。
提前谢谢
【问题讨论】:
自适应阈值效果很好。甚至比静态阈值好得多,尤其是对于来自相机的图像。但这取决于你想做什么。你的形象是一个非常糟糕的例子。您的上一张图片仅表明您的参数完全错误。您的第一个参数 mut 具有显着更高的值,以避免“边缘检测”效应。有两个参数要传递给 AdaptiveThreshold() :两者都会影响结果。对它们进行试验,直到您了解它们的作用。并使用更好的图像进行测试! 【参考方案1】:自适应阈值的作用类似于this:
该函数将灰度图像转换为二值图像 到公式:
THRESH_BINARY
THRESH_BINARY_INV
其中 T(x,y) 是为每个像素单独计算的阈值。
门槛有效differently:
该函数将固定级别的阈值应用于单通道数组。
听起来adaptiveThreshold是逐像素计算阈值,而threshold是为整个图像计算阈值——它用一个标尺测量整个图像,而另一个为每个像素创建一个新的“标尺”。
【讨论】:
如果我要对已自适应阈值化的图像进行斑点分析。中间的正方形会是 1 blob 吗? (我在做表面检测,还得看看opencv中blob检测是怎么工作的,所以我先问一下) 我不知道它会,可能是白色规格。查看这本书,第 231 页,第 6.2 节,比较使用不同阈值的 blob 分析:books.google.com/… 我仍然不明白这种行为。是什么让自适应阈值不同于假设,应用高斯模糊然后减去它并执行正常阈值。根据文档的描述,它们应该是相同的,但它们不是,也许 sigma 是一个非常大的数字。【参考方案2】:我在为 OCR 目的进行自适应阈值处理时遇到了同样的问题。 (对不起,这是 Python 而不是 C++)
img = cv.LoadImage(sys.argv[1])
bwsrc = cv.CreateImage( cv.GetSize(img), cv.IPL_DEPTH_8U, 1)
bwdst = cv.CreateImage( cv.GetSize(img), cv.IPL_DEPTH_8U, 1)
cv.CvtColor(img, bwsrc, cv.CV_BGR2GRAY)
cv.AdaptiveThreshold(bwsrc, bwdst, 255.0, cv.CV_THRESH_BINARY, cv.CV_ADAPTIVE_THRESH_MEAN_C,11)
cv.ShowImage("threshhold", bwdst)
cv.WaitKey()
最后一个参数是用于计算每个像素阈值的邻域大小。如果你的邻居太小(我的邻居是 3 个),它就像边缘检测一样工作。一旦我把它变大,它就按预期工作了。当然,“正确”的尺寸取决于图像的分辨率以及您正在查看的特征的尺寸。
【讨论】:
在搜寻中我找到了这个答案,您能告诉我们 img、bwscr 和 bwdst 使用哪种数据类型吗?是垫子吗? 我记不太清了,但这是我在回答这个问题时正在编写的脚本:github.com/ludflu/ocrprep/blob/master/ocrprep.py 现在才看到是python,还以为是C++以上是关于opencv中自适应阈值和正常阈值之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
opencv阈值处理--threshold函数自适应阈值处理Otsu处理(大津法)