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
自适应阈值的工作原理是这样:
该函数根据公式将灰度图像转换为二进制图像:
Run Code Online (Sandbox Code Playgroud)THRESH_BINARYRun Code Online (Sandbox Code Playgroud)THRESH_BINARY_INV其中T(x,y)是为每个像素单独计算的阈值.
阈值的工作方式不同:
该功能将固定级阈值应用于单通道阵列.
所以听起来自适应阈值逐像素地计算阈值,而阈值计算整个图像的阈值 - 它用一个标尺测量整个图像,而另一个为每个像素制作一个新的"标尺".
我有同样的问题为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),它就像边缘检测一样.一旦我做大了,它按预期工作.当然,"正确"的大小取决于图像的分辨率和您正在查看的功能的大小.