Otsu 的方法阈值制作 'shroud'

Otsu's method thresholding making a 'shroud'

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

尽管当我对它进行阈值处理时,图片的某些部分完全被白色包围,并且在 Opencv 中创建并最终没有检测到图像中的所有轮廓。这是我使用 ret,thresh=cv2.threshold(blurred,0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) 进行 Otsu 方法阈值处理时得到的结果:

编辑: 有人问我正在使用的代码,所以这里是:

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

cv2.imshow('Input Image', image)
cv2.waitKey(0)

blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.adaptiveThreshold(blurred,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
                               cv2.THRESH_BINARY_INV,81,2)
#ret, thresh = cv2.threshold(blurred,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
#thresh_value = 70
#ret,thresh= cv2.threshold(blurred,thresh_value,255,cv2.THRESH_BINARY)

现在它发出一些方格噪音:

尝试全局阈值法,而不是使用 Otsu 的方法。

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

更改 thresh_value 参数,直到获得您想要的结果。

要了解有关阈值技术的更多信息,请参阅 documentation

您无需手动寻找甜蜜点!让 OpenCV 为您代劳!

OpenCV 有一个自适应阈值算法正是针对这样的问题,称为 adaptiveThreshold

该函数将图像分成多个子图像,并分别对每个子图像进行阈值处理。这意味着它将为图像的每个部分找到一个合适的阈值,并为您提供一个漂亮且光线均匀的图像。看到这个 example.

试试这个:

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

更新: 像这样的功能开箱即用。如果它仍然会产生诸如椒盐噪声之类的人工制品,您可以尝试:

  • 显着增加 blockSize。这可以确保每个块内部都有一个字母,这将有望更好地选择阈值。 (例如,将图像分成 25 块而不是 10011 像素的 blocksize 非常小。)
  • 首先应用模糊滤镜来消除产生调味噪音的坏点。 (使用图像名称 blurry 我想您已经这样做了。
  • 首先,简单的 threshold 函数只是去除了一些噪音。例如,将所有高于 5 低于 100 的像素设置为零。然后应用 adaptiveThreshold.
  • 按照@Mark 的建议从原始图像中减去模糊图像。 (参见 话题)

希望对您有所帮助!