自适应阈值处理图像导致数据丢失

2 投票
1 回答
3166 浏览
提问于 2025-04-17 22:30

我正在使用OTSU方法来确定自适应阈值,然后用这个阈值把图像转换成黑白图像。在处理过的图像上,我想进一步确定每个圆圈的密度,但我的黑白图像调整得过头,导致数据丢失。有没有什么建议可以调整自适应阈值?

im_gray = cv2.imread(img, cv2.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
img_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1]

enter image description here enter image description here

1 个回答

3

可以试试 openCV 的 adaptiveThreshold() 函数,它会根据一个小区域内的亮度来计算阈值。看起来你用的 OTSU 方法在这种情况下效果不太好,因为 adaptiveThreshold 只是用一个平均值(减去一个常数),而且效果比 OTSU 更好(见下图)。

另外,OTSU 的空间范围不太清楚。如果它是针对整张图片,那可能会失败,因为图片右边的部分比左边模糊,所以右边的黑色部分就会被冲淡。adaptiveThreshold 是在一个小窗口内进行计算的,所以它是局部自适应的。请注意,下面函数的最后两个参数是窗口的大小和在计算阈值时要从平均值中减去的值。

adaptiveThreshold(I, dst, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 21, 15);

把 OTSU 和局部自适应的特性结合起来,可能会得到更好的结果。不过,白色通常会被过度采样,这会导致估计出现偏差。最好在梯度的两边都进行采样,以便获得相等数量的白色和黑色样本。考虑到连通性和颜色进行阈值处理会更好,参见 grab cut

最后,进行阈值处理时,信息的损失是不可避免的。

enter image description here

撰写回答