2017-01-02 4 views
0

出力に非常に狭い場所を持たずに、連続領域の輪郭を取得したい。OpenCVを使用して狭いボトルネックのない連続領域を見つける

入力画像が(しきい値を適用した後)、この画像のように見えることができます:Input image

だけOpenCVs findContoursメソッドを呼び出すことで、私は次のような結果を得る:Actual output

私の問題は、私はしたくないということです結果に狭い(白い)ピークを持つこと。私は黒のピークを含んではならないので、画像をぼかすだけでは機能しません。したがって、必要な出力はこの緑色の線のようになります。Ideal output

エリアの最小「厚さ」をOpenCV(findContours)に伝えることは可能ですか?

+0

それらを取り除く? –

答えて

1

Erosionを背景に境界画素を追加すると考えることができます。したがって、それはあなたの入力のような狭い部分を取り除きます。しかし、すべての境界を歪ませるので、実際の境界でエロージョンの影響を取り消すには、その後dilationを適用する必要があります。浸食+膨張プロセスはopeningと呼ばれます。

以下のコード部分は、望ましい出力を生成します。画像サイズに応じてk_sizeで遊んでください。次にfindContoursを適用します。

# Read and binarize the image 
image = cv2.imread("test.png",cv2.IMREAD_GRAYSCALE) 
ret, im_th =cv2.threshold(image,150,255,cv2.THRESH_BINARY) 

# Set the kernel and perform opening 
k_size = 7 
kernel = np.ones((k_size,k_size),np.uint8) 
opened = cv2.morphologyEx(im_th, cv2.MORPH_OPEN, kernel) 
cv2.imwrite("opened.png", opened) 

出力:あなたが[モルフォロジー演算](http://docs.opencv.org/trunk/d9/d61/tutorial_py_morphological_ops.html)を使用していないのはなぜ

Opened output with no islands

+0

ありがとうございます、あなたのソリューションは完璧に動作します! – wessnerj

0

findContoursを実行する前に、浸食を行い、次に小さなカーネルで膨張させます。ちょうどそれを行うのOpenCVにおけるオペレータの特別な種類があります、このような何かが動作するはずmorphologyEx

Openingと呼ば:

morphologyEx(src, dst, MORPH_OPEN, Mat()); 
関連する問題