2017-05-01 156 views
0

我有幾張圖像,如下所示: 圖像主要在白色背景上。Opencv提取最大感興趣的區域

在白色(大部分)背景上佈置了多件衣物。 enter image description hereenter image description here

我試着用opencv連接的組件檢測到兩件衣服。 試圖採取最大的兩個連接組件,不幸的是,我失敗了。

我相信這是可能的,但由於我是opencv的新手,有人可以告訴我們可以做些什麼來檢測以下圖像中的多件衣服嗎?

任何幫助表示讚賞

代碼,我試圖在python:

#Read the image and conver to grayscale 
img = cv2.imread('t.jpg' , 0) 
#Applt the median filter on the image 
#med = cv2.medianBlur(image,5) # 5 is a fairly small kernel size 
#Apply an edge detection filter 

laplacian = cv2.Laplacian(img,cv2.CV_64F) 

laplacian = laplacian.astype(np.uint8) 
ret,thresh1 = cv2.threshold(laplacian,127,255,cv2.THRESH_BINARY) 
src = thresh1 
src = np.array(src, np.uint8) 
ret, thresh = cv2.threshold(src,10,255,cv2.THRESH_BINARY) 
# You need to choose 4 or 8 for connectivity type 
connectivity =8 
# Perform the operation 
output = cv2.connectedComponentsWithStats(thresh, connectivity, cv2.CV_32S) 
# Get the results 
# The first cell is the number of labels 
num_labels = output[0] 
# The second cell is the label matrix 
labels = output[1] 
# The third cell is the stat matrix 
stats = output[2] 
# The fourth cell is the centroid matrix 
centroids = output[3] 
src = cv2.cvtColor(src,cv2.COLOR_GRAY2RGB) 
for stat in stats: 
    x , y ,w , h ,a = stat 
    cv2.rectangle(src,(x,y),(x+w,y+h),(0,0,255),2) 
    # write original image with added contours to disk 
    #cv2.imwrite('contoured.jpg', image) 
cv2.imshow("Image", src) 
#cv2.waitKey(0) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

我上面的代碼

enter image description here

NB輸出:其優良即使我可以提取給定圖像中的最大對象。

回答

1

這是一個非常簡單的方法,只是使用圖像閾值和查找輪廓來提取第二張圖片中最大的一件衣服。爲了得到另一個項目,您只需調整閾值以使其不會被消除,那麼您就可以搜索輪廓。不是最好的解決方案,但它是一個開始。

img = cv2.imread('t.jpg' , 0) # import image as grayscale array 

# threshold image 
img_b = cv2.GaussianBlur(img, (13, 13), 2) 
ret, img_th = cv2.threshold(img_b, 40, 255, cv2.THRESH_BINARY_INV) 
# find contours 
(_,cnts,_) = cv2.findContours(img_th.copy(), cv2.RETR_TREE, 
cv2.CHAIN_APPROX_SIMPLE) 
print(str(len(cnts))+' contours detected') 

# find maximum area contour 
area = np.array([cv2.contourArea(cnts[i]) for i in range(len(cnts))]) # 
list of all areas 
maxa_ind = np.argmax(area) # index of maximum area contour 

plt.figure(figsize=(10,4)) 
plt.subplot(1,3,1) 
plt.imshow(img_b) 
plt.title('GaussianBlurr') 
plt.subplot(1,3,2) 
plt.imshow(img_th) 
plt.title('threshold') 
plt.subplot(1,3,3) 
xx = [cnts[maxa_ind][i][0][0] for i in range(len(cnts[maxa_ind]))] 
yy = [cnts[maxa_ind][i][0][1] for i in range(len(cnts[maxa_ind]))] 
ROI.append([min(xx),max(xx),min(yy),max(yy)]) 
plt.imshow(img) 
plt.plot(xx,yy,'r',linewidth=3) 
plt.title('largest contour') 

此代碼產生以下圖像:

enter image description here

相關問題