我试着在图像中得到盒子的角。下面是示例图像,它们的阈值结果,右边箭头后面是我需要的结果。你可能已经看到过这些图像,因为我用这些图像来回答我的松弛问题。
下面的代码允许我到达中间的图像。
import cv2
import numpy as np
img_file = 'C:/Users/box.jpg'
img = cv2.imread(img_file, cv2.IMREAD_COLOR)
img = cv2.blur(img, (5, 5))
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
thresh0 = cv2.adaptiveThreshold(s, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
thresh1 = cv2.adaptiveThreshold(v, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
thresh2 = cv2.adaptiveThreshold(v, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
thresh = cv2.bitwise_or(thresh0, thresh1)
cv2.imshow('Image-thresh0', thresh0)
cv2.waitKey(0)
cv2.imshow('Image-thresh1', thresh1)
cv2.waitKey(0)
cv2.imshow('Image-thresh2', thresh2)
cv2.waitKey(0)
在opencv中有没有什么方法可以帮我做到这一点。我尝试了膨胀cv2.dilate()
和腐 eclipse cv2.erode()
,但它在我的情况下不工作。或者如果没有,那么有什么可以替代的方法来做它?谢谢
谨慎版本的图像......左侧为低阈值,右侧为高阈值
4条答案
按热度按时间cnjp1d6j1#
下面是@dhanushka方法的python实现
如果您处理的图像是发票(或在白色背景上有大量文本),上述代码不会给予好的结果。为了在此类图像上获得好的结果,请删除
并将
morph
obj传递给split函数,并删除for循环内的~
符号yqyhoc1h2#
你可以通过使用一个放大的结构元素来应用形态学的闭合和打开操作,在一定程度上平滑图像。
第一页
然后取图像的形态梯度。
第一次
然后对每个通道应用大津阈值,并合并这些通道。
第一次
如果你的图片尺寸不同(更大),你可能需要修改代码的一些参数,或者把图片的大小调整到这里使用的大小。代码是
c++
,但是移植到python
并不难。kb5ga3dv3#
不确定该解决方案的鲁棒性如何,但想法很简单。框的边缘应该比那些图像上的所有其他高频更明显。因此,使用一些基本的预处理应该允许强调它们。
我用你的代码做了一个原型,但是轮廓查找并不一定是正确的路径。也很抱歉迭代反锐化遮罩-没有时间调整参数。
anauzrmj4#
方法1:使用人工智能模型
总是尝试图像分割模型如果可行到你的项目,鲁棒的模型将工作更好在一个更宽的域比任何阈值技术.例如Rembg,尝试在线在一个Huggingface space
结果如下:
第一次
方法二:
几乎与其他答案相似,但采用了另一种方法。
1.我们使用
cv2.bilateralFilter
,它类似于photoshop的表面模糊,read more,而不是关闭和打开来模糊“噪声第一次
1.用sobel滤波器寻找边缘
指令集
1.应用阈值,我在这里使用Sauvola Thresholding:
1.扩张和填充孔:
指令集