【问题标题】:Otsu's method thresholding making a 'shroud'Otsu 的方法阈值制作“裹尸布”
【发布时间】:2019-01-19 17:54:19
【问题描述】:

我正在尝试在 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)

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

【问题讨论】:

  • 这是因为图像边缘的亮度损失。捕捉更均匀照明的场景或使用不同的镜头
  • 这里的问题是闪电不是轮廓或阈值。您是否仅限于此图像?您需要在这种情况下进行图像处理吗?
  • 如果我能在这些条件下进行图像处理,那就太好了,因为我不能告诉每个使用它的人出去晒太阳
  • 或获得更强大的灯光
  • 尝试模糊/平均您的图像,例如 100x100(这将删除高频信息,只留下缓慢变化的东西,例如不均匀的照明)并从原始图像中减去模糊图像以去除缓慢变化的东西并离开文字的锐利细节...stackoverflow.com/a/27893051/2836621

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


【解决方案1】:

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

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

此函数将图像划分为多个子图像,并分别对每个子图像进行阈值处理。这意味着它将为图像的每个部分找到一个不错的阈值,并为您提供一个漂亮且均匀照明的图像。看到这个example

试试这个:

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

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

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

我希望这会有所帮助!

【讨论】:

  • 它会产生大量的椒盐噪声,从而在 opencv 中造成很大的破坏,并给出像 5698 contours detected 这样的数字。至少大津的阈值在它实际得到的部分给出了一个很好的阈值
  • @Nazar,我用更多建议更新了我的答案。我希望它有所帮助。
  • 仍然发出椒盐噪声,现在甚至不再检测到字母了:(
  • 正常阈值是什么意思?
  • @NazarKhan 您可以微调窗口大小和重量,以获得所需的输出,同时减少椒盐噪声。如果它仍然妨碍您,那么您可以过滤尺寸上的轮廓以忽略导致椒盐噪声的非常小的轮廓,您也可以尝试一些形态学操作。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我改变了答案。试试这个
  • 现在它要么吃掉字母,要么不检测中间的字母。没有最佳位置尝试更改 thresh_value
  • 直到您到达最佳位置更改thresh_value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 2012-10-08
  • 2022-06-22
  • 1970-01-01
  • 2018-05-17
  • 2014-05-07
相关资源
最近更新 更多