我是图像处理的新手,我正在处理以下图像并使用以下代码应用阈值来识别边缘
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对象的一部分。
我通过更改阈值来多次运行代码,但没有成功获得该框。我究竟做错了什么 ?有人可以帮助吗?感谢。
答案 0 :(得分:2)
您应该考虑尝试自适应阈值
AND (Number LIKE '%' + @Number + '%') OR (Place LIKE '%' + @Place + '%')
这就是我得到的:
现在使用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之间的值。假设这些点之外的任何值都是异常值。由于图像被认为是数据,因此这里也假设了这个概念。
看看这个:
现在你频繁发布的第二个框:
我一直想尝试以下方法。试一试,让我知道:
可能有更好的方法来检测我尚未遇到的情况。但这是一种很好的,非常有趣的方式。