OpenCV - 使用python管理图像处理中的阈值

时间:2016-11-25 14:47:09

标签: python image opencv image-processing

我是图像处理的新手,我正在处理以下图像并使用以下代码应用阈值来识别边缘

import cv2
import numpy as np

img = cv2.imread("box.jpg")
img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
noise_removal = cv2.bilateralFilter(img_gray,9,75,75)
ret,thresh_image = cv2.threshold(noise_removal,0,255,cv2.THRESH_OTSU)

左侧是原始图像。中间是代码中img_gray计算的灰度图像。右侧是由thresh_imgage计算的阈值图片

我的问题来自图像1和图2,我们可以看到角落处的渐变发生了显着变化,但在阈值图像中,它还包括 shadow 作为box对象的一部分。

我通过更改阈值来多次运行代码,但没有成功获得该框。我究竟做错了什么 ?有人可以帮助吗?感谢。

enter image description here

2 个答案:

答案 0 :(得分:2)

您应该考虑尝试自适应阈值

AND (Number LIKE '%' + @Number + '%') OR (Place LIKE '%' + @Place + '%')

这就是我得到的:

enter image description here

现在使用THIS PAGE中提到的形态操作,您可以获得所需的对象。

答案 1 :(得分:1)

我刚刚遇到了另一个关于选择最佳阈值进行边缘检测的解决方案。我之前的回答是关于自适应阈值,你很清楚。

最佳我的意思是根据灰度图像的中值值选择两个值(下阈值和上阈值)。以下代码显示了它的完成方式:

v = np.median(gray_img)
sigma = 0.33

#---- apply optimal Canny edge detection using the computed median----
lower_thresh = int(max(0, (1.0 - sigma) * v))
upper_thresh = int(min(255, (1.0 + sigma) * v))
edge_img = cv2.Canny(gray_img, lower_thresh, upper_thresh)
cv2.imshow('Edge_of_box',edge_img)

0.33 sigma 值是数据科学领域中最优的值。

插图: 如果您在统计中观察到高斯曲线,则会在分布中考虑曲线两侧的0.33之间的值。假设这些点之外的任何值都是异常值。由于图像被认为是数据,因此这里也假设了这个概念。

看看这个:

enter image description here

现在你频繁发布的第二个框:

enter image description here

你怎么能改善这个?

我一直想尝试以下方法。试一试,让我知道:

  • 首先尝试用 mean 替换中值值并观察 结果。
  • 更改 sigma 值并观察边缘检测的变化情况。
  • 尝试对图像的小块执行上述技术。将图像分成小块,然后按照自己的方式进行操作。 (我的说法' 本地化边缘检测')

可能有更好的方法来检测我尚未遇到的情况。但这是一种很好的,非常有趣的方式。