opencv チュートリアル チャレンジ5 モルフォロジー変換

モルフォロジー変換 — OpenCV-Python Tutorials 1 documentation

モルフォロジー変換

とりあえず、カーネルはこれでテスト。

kernel = np.ones((5,5),np.uint8)

[
[ 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1 ],
[ 1, 1, 1, 1, 1 ]
]

ということだ。

[
[ 0, 0, 1, 0, 0 ],
[ 0, 0, 1, 0, 0 ],
[ 0, 0, 1, 0, 0 ],
[ 0, 0, 1, 0, 0 ],
[ 0, 0, 1, 0, 0 ]
]

とすれば、縦方向にだけ評価して適用してくれる、、、のかな。

元画像はこれ f:id:pongsuke:20170523103622p:plain

おそらく、黒い背景 が前提の処理だと思う。

収縮(Erosion)

img = cv2.erode(img,kernel,iterations = 1)

f:id:pongsuke:20170523103657p:plain

膨張(Dilation)

dilation = cv2.dilate(img,kernel,iterations = 1)

f:id:pongsuke:20170523103719p:plain

オープニング(Opening)

オープニング処理は 収縮の後に膨張 をする処理です.上述したようにノイズ除去に有効です

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

f:id:pongsuke:20170523103728p:plain

クロージング(Closing)

クロージング処理はオープニング処理の逆の処理を指し, 膨張の後に収縮 をする処理です.前景領域中の小さな(黒い)穴を埋めるのに役立ちます

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

f:id:pongsuke:20170523103732p:plain

モルフォロジー勾配

膨張した画像と収縮した画像の差分をとる処理です.
結果として物体の外郭(境界線)が得られます.

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

f:id:pongsuke:20170523103738p:plain

トップハット変換

ブラックハット変換

この2つは、使いみちが分かっらない・・・

カーネルの変更

カーネルを変えてみた。

kernel = np.array([
[ 0, 0, 1, 0, 0],
[ 0, 0, 1, 0, 0],
[ 0, 0, 1, 0, 0],
[ 0, 0, 1, 0, 0],
[ 0, 0, 1, 0, 0]
], dtype = np.uint8)


img = imgOrg
img = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erode2', img)
cv2.imwrite('erode2.png', img)

全部1と比較してみる。

全部1 f:id:pongsuke:20170523104544p:plain

縦に1 f:id:pongsuke:20170523104547p:plain