0

この画像でfind_contour(opencvモジュール)を適用すると、5つのオブジェクト(記号ごとに1つ)のみを取得できます:https ://docs.google.com/file/d/0ByS6Z5WRz-h2WHEzNnJucDlRR2s/edit ?今私は64のオブジェクトを取得します

その後、Humomentsを取得して、他の画像と比較したいと思います。今のところ、同じ画像を少し翻訳してみます。テストすると、同じ画像が返されます。

私の質問私はどうすればユーモメントを適用するために5つのオブジェクトだけを取得できますか、または画像のユーモメントを計算する他の解決策がある場合はどうすればよいですか?

import cv2
im = cv2.imread('Sassatelli 1984 n. 165 mod1.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(imgray, (0,0), 5) 
cv2.imshow('Blur', blur)
cv2.waitKey()
th = 20
edges = cv2.Canny(blur, th, th*3)
cv2.imshow('canny',edges)
cv2.waitKey()
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print('objects found')
print(len(contours))
cnt = contours[0]
cv2.drawContours(blur,contours,-1,(0,255,0),3)
cv2.imshow('draw contours',blur)
cv2.waitKey()
moments = cv2.moments(cnt)
4

1 に答える 1

2

ケース1:画像をjpg形式で 保存する際の問題白黒のみ(つまり、ピクセル値0および255のみ)の画像をjpg形式で保存すると、非可逆圧縮が発生し、ピクセル値が変更されます。見たい場合は、そのような画像を作成し、jpgで保存し、保存した画像を開いて、白黒の端にズームします。ピクセル値の変化を確認できます。

したがって、輪郭を見つけるときは、白いオブジェクトしかないことを期待しますが、実際には、輪郭と見なされる中間値もいくつかあります。輪郭の数が増えます。

したがって、この問題を回避するには、

  • 画像をpngまたはその他のロスレス形式などで保存することをお勧めします。
  • 輪郭を見つける前に、しきい値を適用して(127の値または必要に応じて)、画像を実際のバイナリ1にします。

これについては、ここでさらに詳しく説明します。「list(contour)」の結果は何を意味しますか?

ケース2:白い背景の問題

OpenCV findcontours()は、黒い背景にある白いオブジェクトを検索するように設計されています。したがって、背景が白の場合は、1つのオブジェクトとしても扱われます。したがって、輪郭を見つける前に画像を反転します。

ケース3:オブジェクトの穴の問題

オブジェクトに穴がある場合は、それもオブジェクトと見なされます。したがって、オブジェクトの外部境界のみが必要な場合は、cv2.RETR_EXTERNALfindcontours()関数にフラグを使用します。

サンプルコード:

import cv2
import numpy as np
img = cv2.imread('sof.jpg')
gray = cv2.imread('sof.jpg',0)
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)

しきい値処理および反転画像

ここに画像の説明を入力してください

次に、輪郭を見つけて描画し、輪郭の数を確認します。

cv2.drawContours(img,contours,-1,(0,255,0),2)
cv2.imshow('img',img),cv2.waitKey(0),cv2.destroyAllWindows()

結果 :

ここに画像の説明を入力してください

ノート :

ここでは、外部の輪郭のみを取りました。これらのオブジェクトから内部の穴を削除する場合は、cv2.RETR_TREEまたはcv2.RETR_CCOMPフラグを使用し、それらの階層を確認して削除する必要があります。このリンクで説明されています:輪郭5:階層

于 2013-01-21T11:00:21.090 に答える