13

我有这个灰色的视频流: 在此处输入图像描述

此图像的直方图:

在此处输入图像描述

阈值图像:

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

我得到:

在此处输入图像描述

我期望的。

当我使用以下方法进行自适应阈值处理时:

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

我得到:

在此处输入图像描述

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

提前谢谢

4

2 回答 2

10

我在为 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 个),它就像边缘检测一样工作。一旦我把它变大,它就按预期工作了。当然,“正确”的大小将取决于图像的分辨率以及您正在查看的特征的大小。

于 2012-01-17T17:03:00.433 回答
10

自适应阈值的工作方式如下

该函数根据以下公式将灰度图像转换为二值图像:

    THRESH_BINARY

THRESH_BINARY

    THRESH_BINARY_INV

THRESH_BINARY_INV

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

阈值的工作方式不同

该函数将固定级别的阈值应用于单通道阵列。

所以听起来adaptiveThreshold逐像素计算阈值,而threshold是为整个图像计算阈值——它用一个标尺测量整个图像,而另一个为每个像素制作一个新的“标尺”。

于 2011-11-29T18:15:42.863 回答