【问题标题】:How to remove part of images around board - opencv如何删除电路板周围的部分图像 - opencv
【发布时间】:2021-08-13 20:31:35
【问题描述】:

我正在与 ROI 合作,而我正在寻找这个中心元素。但是上面这部分图片我需要删除。

smooth= cv2.GaussianBlur(gray, (3, 3), cv2.BORDER_DEFAULT)
T, thresh = cv2.threshold(smooth, 32, 255, cv2.THRESH_BINARY)

#roi = cv2.selectROI(thresh)
#print(roi)#=(2, 176, 36, 31)
roi_cropped = thresh[176:(176+31),2:(2+36)]

#kernel = np.ones((3, 3), np.uint8)
#erode = cv2.erode(roi_cropped, kernel) 
#show(erode)

contours, hierarchy = cv2.findContours(image=roi_cropped, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)

image_copy = img.copy()
cv2.drawContours(image=image_copy[176:(176+31),2:(2+36)], contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=1, lineType=cv2.LINE_AA)
show(image_copy)

【问题讨论】:

  • 获取每个轮廓的边界框。检查边界框是否接触到图片的边缘。那是 4 个比较: box.left == 0? box.left+box.width ==图片宽度? ... y 轴相同

标签: python-3.x opencv roi


【解决方案1】:

这很简单。检查轮廓的边界框是否接触到图片的边缘。

# have `contours` from `roi_cropped`

(height, width) = roi_cropped.shape[:2]

for c in contours:
    (x, y, w, h) = bbox = cv.boundingRect(c)
    touches_edges = (x == 0) or (y == 0) or (x+w == width) or (y+h == height)
    print(touches_edges, ":", bbox)

您可以弄清楚如何擦除轮廓。有多种选择:

您可能甚至不需要擦除这些斑点。只是忽略他们。

【讨论】:

    【解决方案2】:

    如果我没有误解你的问题,这里是代码:

    import cv2
    import numpy as np
    
    
    # load the image
    image = cv2.imread("faces/stacl.png",0)
    
    output = image.copy()
    
    contours, hierarchy = cv2.findContours(image=output, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
    
    if len(contours) != 0:
        cv2.drawContours(output, contours, 1, 1, 44) #the key point of the code
    #for the small image:
    #cv2.drawContours(output, contours, 1, 1, 2)
    
    
    ret,th=cv2.threshold(output,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    #for the small image:
    #kernel=np.ones((2,2),np.uint8)
    kernel=np.ones((12,5),np.uint8) 
    
    
    open=cv2.morphologyEx(th,cv2.MORPH_OPEN,kernel) #bu
    
    dist_transform = cv2.distanceTransform(open,cv2.DIST_L2,5)
    cv2.imshow("Result", dist_transform)
    
    cv2.waitKey(0)
    

    【讨论】:

    • 实图很小ibb.co/t3FzNmv
    • 我不明白你所说的“真实图像”是什么意思。您想处理您在 ibb.co/t3FzNmv 中链接的图像吗?在这种情况下,您基本上可以使用 image=cv2.resize(image,(250,250)) ;或者只是改变内核大小和轮廓。我已经为小图像添加了代码。
    • 这段代码如何检查斑点/轮廓是否接触到图片的边缘?距离变换似乎是多余的,您所做的只是应用一些仅适用于该特定图片的形态。
    • 您说的很对,感谢您指正并指出我的错误。您指出的边界框方法对于进一步的问题更有效。
    猜你喜欢
    • 2017-10-28
    • 2018-02-08
    • 2023-04-02
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2020-11-10
    • 2020-02-16
    相关资源
    最近更新 更多