大津的方法阈值制作“裹尸布”

时间:2018-08-13 03:40:26

标签: python-3.x opencv image-thresholding

我正在尝试使用Opencv中的Otsu方法对图像进行阈值处理:

input-image

尽管当我设定阈值时,图片的某些部分完全被白色包围,并在Opencv中创建并最终没有检测到图像中的所有轮廓。这是我使用$numbers = [1, 2, 3, 4, ... 10000000]; $inverted = array_fill(0, count($numbers), 0); foreach ($numbers as $i => $num) { $inverted[$i] = 1 / $num; } 执行大津的方法阈值时得到的:

thresholding-the-image

编辑: 有人要求我使用的代码,因此这里是:

ret,thresh=cv2.threshold(blurred,0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

现在它发出一些方格的声音:WOAH

2 个答案:

答案 0 :(得分:2)

您无需手动找到最佳位置!让OpenCV为您做到!

OpenCV完全有一个自适应阈值算法,该问题来自于此类问题,称为adaptiveThreshold

此功能将图像分为多个子图像,并分别阈值。这意味着它将为图像的每个部分找到一个不错的阈值,并为您提供一个美观且均匀照明的图像。参见此example

尝试一下:

th3 = cv.adaptiveThreshold(blurred,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\
        cv.THRESH_BINARY,11,2)

更新: 像这样的功能并不是开箱即用的。如果它仍然会产生类似盐和胡椒味的伪影,则可以尝试:

  • 大大提高了blockSize。这样可以确保每个块的内部都有一个字母,这将希望可以更好地选择阈值。 (例如,将图像分成25个块而不是100blocksize个像素11个很小。)
  • 首先应用模糊滤镜,以消除产生调味噪声的坏点。 (使用图片名称blurry,我想您已经完成了此操作。
  • 首先,简单的threshold函数可以消除一些噪音。例如,将所有5 高于100的像素设置为零。然后,再应用adaptiveThreshold
  • 按照@Mark的建议从原始图像中减去模糊的图像。 (请参见this线程)

我希望这会有所帮助!

答案 1 :(得分:0)

尝试使用全局阈值方法代替Otsu的方法。

thresh_value = 50
ret,thresh= cv2.threshold(blurred,thresh_value,255,cv2.THRESH_BINARY)

更改thresh_value参数,直到获得所需的结果。

要进一步了解阈值技术,请参阅documentation