我得到的是碎片工件(金属片)而不是整个工件。看起来边缘不是连续的,但它们是
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)
我的目标是检测放置在白色表面上的物体。从那里数出有多少个,然后计算每个的面积。
看来这个算法是在检测它的边缘,但是把它算作多个对象。
原图
边缘检测后的图片
部分图片有问题
结果
简而言之,我使用的是“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)