8

我正在寻找图像二值化的最佳自适应阈值方法。但是我对黑暗和模糊的图像有任何问题。
输入图像:
让图像加载...

当我使用自适应阈值方法时,我收到此
输出图像
让图像加载...

这对我不好!
那么,有人可以帮我解决这个问题吗?


另一张图片:在此处输入图像描述

和 :在此处输入图像描述

@Hammer'solution 的第一个看起来非常糟糕(我必须选择 c 通道),第二个我可以使用自适应阈值正常。
所以我想为所有情况找到最佳解决方案。

再次感谢!

4

4 回答 4

8

看起来颜色比强度更好地指示图像中的分割。尝试将其转换为 HSV,然后在 H 通道上运行 OTSU。

在蟒蛇

hsv = cv2.cvtColor(image, cv2.cv.CV_BGR2HSV)
cv2.imshow('hsv', hsv[:,:,0])
(thresh, im_bw) = cv2.threshold(hsv[:,:,0], 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow('OTSU', im_bw)

给出 (hsv)

在此处输入图像描述

然后(大津)

在此处输入图像描述

有点腐蚀和膨胀,你应该很高兴

于 2013-09-05T05:55:21.407 回答
6

您可能对openCV 使用的这些自适应阈值感兴趣。

我使用了自适应平均阈值。您可能需要稍微调整一下参数,但如果您的图像相似(相同大小等),希望不需要太多调整。

# Smooth image
filtered = cv2.adaptiveThreshold(input_image.astype(np.uint8), 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 41, 3)

# Some morphology to clean up image
kernel = np.ones((5,5), np.uint8)
opening = cv2.morphologyEx(filtered, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)

结果:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

于 2014-07-23T09:03:40.723 回答
3

以下代码...

im=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,111,3)
cv2.imshow('mkm',im)`

...给出了一个很好的结果:

自适应图像

于 2017-03-19T00:36:14.917 回答
1

如果单个阈值不足以分离所有图像,您可以尝试使用两个阈值的分水岭算法。

使用高阈值来获取具有绝对属于数字的片段的图像,使用高逆阈值来获取具有绝对不属于数字的片段的图像。

稍微腐蚀两个图像以增加确定性。

然后使用 2 个图像作为 Watershed 的种子。

这是完成此操作的答案

于 2013-09-05T13:43:34.233 回答