用python管理图像处理中的阈值

2024-05-15 12:00:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新的图像处理,我正在处理下面的图像和应用阈值,以识别边缘与以下代码

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中我们可以看到,在角点处的梯度有明显的变化,但在阈值图像中,它也包含了作为长方体对象一部分的阴影。在

我已经通过改变阈值运行了几次代码,但是没有成功地只得到了盒子。我做错什么了?有人能帮忙吗?谢谢。在

enter image description here


Tags: 代码图像importnumpyimgasnp阈值
2条回答

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

所谓的最优是指根据灰度图像的中值值选择两个值(下限和上限)。下面的代码将向您展示如何完成此操作:

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的西格玛值是数据科学领域中最理想的值。在

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

看看这个:

enter image description here

现在,你经常贴的第二个盒子:

enter image description here

你如何改善这一点?在

我一直想试试下面的方法。试试看,一定要告诉我:

  • 首先尝试将中值替换为平均值,并观察 结果。在
  • 更改sigma值并观察边缘检测如何变化。在
  • 尝试对图像的一小部分执行上述技术。将图像分成小块,然后按你的方式处理。(我的意思是“局部边缘检测”)

也许有更好的方法来发现我还没有遇到的。但这是一个伟大的和有趣的开始方式。在

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

adp_th = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 5, 1.8)

我得到的是:

enter image description here

现在使用THIS PAGE中提到的形态学运算你可以得到你想要的对象。在

相关问题 更多 >