我有这个灰色的视频流:
此图片的直方图:
阈值图像:
threshold( image, image, 150, 255, CV_THRESH_BINARY );
我得到:
我期待的。
当我使用自适应阈值处理时:
adaptiveThreshold(image, image,255,ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY,15,-5);
我得到:
这看起来像边缘检测而不是阈值。我所期待的是黑白区域。所以我的问题是,为什么这看起来像边缘检测而不是阈值处理。
事先提前答案 0 :(得分:10)
自适应阈值的工作方式与this类似:
该功能可将灰度图像转换为二进制图像 公式:
THRESH_BINARY
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),它就像边缘检测一样。一旦我做大了,它按预期工作。当然,“正确”的大小取决于图像的分辨率以及您正在查看的功能的大小。