-1

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

输入图像

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

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

4

2 回答 2

2

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

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

该函数将图像划分为多个子图像,并对每个子图像单独设置阈值。这意味着它将为图像的每个部分找到一个不错的阈值,并为您提供一个漂亮且均匀照明的图像。请参阅此示例

尝试这个:

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

更新: 像这样的功能不能完美地开箱即用。如果它仍然会产生像椒盐噪声这样的伪影,您可以尝试:

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

我希望这有帮助!

于 2018-08-13T09:50:22.237 回答
0

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

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

改变thresh_value参数,直到你得到你想要的结果。

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

于 2018-08-13T03:52:48.983 回答