2017-05-01 20 views
0

私は以下のような画像をいくつか持っています: 画像はほとんど白い背景にあります。Opencvは最も関心のある領域を抽出します

白い(主に)背景に複数の衣服がレイアウトされています。 enter image description hereenter image description here

opencv接続コンポーネントを使用して2つの衣服を検出しようとしました。 最大の2つの接続コンポーネントを使用しようとしましたが、残念ながら、私は失敗しています。

私はこれが可能だと信じていますが、私は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

ここでは、画像の閾値化と輪郭を見つけて、2番目の写真の衣服のうち最大のアイテムだけを抽出する、非常に簡単なアプローチです。他のアイテムを取得するには、しきい値処理を調整して拭き取らないようにしなければなりません。そうすれば、輪郭を検索することができます。最高の解決策ではありませんが、それはスタートです。

enter image description here

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') 

このコードは、次の画像を生成します

関連する問題