我得到的是碎片工件(金属片)而不是整个工件。看起来边缘不是连续的,但它们是

I am getting fractional artifacts (pieces of metal) instead of whole ones. It seems that the edges are not continuous but they are

我的目标是检测放置在白色表面上的物体。从那里数出有多少个,然后计算每个的面积。

看来这个算法是在检测它的边缘,但是把它算作多个对象。

原图

边缘检测后的图片

部分图片有问题

结果

简而言之,我使用的是“canny”和“连通分量”,我得到的是小数对象而不是整个对象。

以下代码应该可以完成工作,您可能需要调整 minItemArea 和 maxItemArea 来过滤对象。

import numpy as np
import cv2
import matplotlib.pyplot as plt

rgb = cv2.imread('/path/to/your/image/items_0001.png')
gray = cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY)

imh, imw = gray.shape

th = cv2.adaptiveThreshold(gray,255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY_INV,21,5)

contours, hier = cv2.findContours(th.copy(),cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)

out_img = rgb.copy()
minItemArea = 50
maxItemArea = 4000

for i in range(len(contours)):
    if hier[0][i][3] != -1:
        continue
        
    x,y,w,h = cv2.boundingRect(contours[i])
    if minItemArea < w*h < maxItemArea:
        cv2.drawContours(out_img, [contours[i]], -1, 255, 1)

plt.imshow(out_img)