opencv中自适应阈值与正常阈值的区别

时间:2011-11-29 18:06:41

标签: c++ image-processing opencv threshold

我有这个灰色的视频流: enter image description here

此图片的直方图:

enter image description here

阈值图像:

  threshold( image, image, 150, 255, CV_THRESH_BINARY );

我得到:

enter image description here

我期待的。

当我使用自适应阈值处理时:

adaptiveThreshold(image, image,255,ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY,15,-5);

我得到:

enter image description here

这看起来像边缘检测而不是阈值。我所期待的是黑白区域。所以我的问题是,为什么这看起来像边缘检测而不是阈值处理。

事先提前

2 个答案:

答案 0 :(得分:10)

自适应阈值的工作方式与this类似:

  

该功能可将灰度图像转换为二进制图像   公式:

    THRESH_BINARY
     

THRESH_BINARY

    THRESH_BINARY_INV
     

THRESH_BINARY_INV

     

其中T(x,y)是为每个像素单独计算的阈值。

阈值有效differently

  

该函数将固定级阈值应用于单通道数组。

因此听起来自适应阈值逐像素计算阈值,而阈值则计算整个图像的阈值 - 它用一个标尺测量整个图像,而另一个为每个像素制作一个新的“标尺”。 / p>

答案 1 :(得分:9)

我有同样的问题为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),它就像边缘检测一样。一旦我做大了,它按预期工作。当然,“正确”的大小取决于图像的分辨率以及您正在查看的功能的大小。