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

Oli*_*s_j 13 c++ opencv image-processing threshold

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

该图像的直方图:

在此输入图像描述

阈值图像由:

  threshold( image, image, 150, 255, CV_THRESH_BINARY );
Run Code Online (Sandbox Code Playgroud)

我得到:

在此输入图像描述

我所期待的.

当我做自适应阈值处理时:

adaptiveThreshold(image, image,255,ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY,15,-5);
Run Code Online (Sandbox Code Playgroud)

我得到:

在此输入图像描述

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

thx提前

djh*_*987 10

自适应阈值的工作原理是这样:

该函数根据公式将灰度图像转换为二进制图像:

    THRESH_BINARY
Run Code Online (Sandbox Code Playgroud)

THRESH_BINARY

    THRESH_BINARY_INV
Run Code Online (Sandbox Code Playgroud)

THRESH_BINARY_INV

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

阈值的工作方式不同:

该功能将固定级阈值应用于单通道阵列.

所以听起来自适应阈值逐像素地计算阈值,而阈值计算整个图像的阈值 - 它用一个标尺测量整个图像,而另一个为每个像素制作一个新的"标尺".


non*_*ont 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()
Run Code Online (Sandbox Code Playgroud)

最后一个参数是用于计算每个像素的阈值的邻域的大小.如果您的邻居太小(我的是3),它就像边缘检测一样.一旦我做大了,它按预期工作.当然,"正确"的大小取决于图像的分辨率和您正在查看的功能的大小.