BETA

OpenCV生活15日目 膨張と収縮の組み合わせによるopeningとclosing

投稿日:2020-07-21
最終更新:2020-07-21

画像に対する膨張と収縮の組み合わせによって、openingとclosingという2つの操作が実現できます。
openingは周辺よりもピクセル値が大きい点を取り除くことができ、closingは周辺よりもピクセル値が小さい点を取り除くことができます。これによってノイズの除去や連結した領域を分割したり、逆に連結させたりできます。

opening

openingは収縮(erode)の後に膨張(dilate)をおこなうことで実現できます。
例えば次のような画像を考えます。

np.random.seed(0)  
A = (np.random.rand(15, 15) > 0.3) * 255  
A = A.astype(np.uint8)  


これの画像に対して、次のようにopeningの操作をおこないます。

kernel = np.ones([2, 2], np.uint8)  
erosion = cv2.erode(A, kernel, iterations=1)  
dilation = cv2.dilate(erosion, kernel, iterations=1)  
plt.imshow(dilation)  
plt.gray()  
plt.show()  


周辺よりもピクセル値が大きい点を取り除けていることが分かるでしょうか。

ちなみに次のようにしてもopeningをおこなえます。結果は上記と全く同じになります。

opening = cv2.morphologyEx(A, cv2.MORPH_OPEN, kernel)  
plt.imshow(opening)  
plt.gray()  
plt.show()  

closing

closingは膨張(dilate)の後に収縮(erode)をおこなうことで実現できます。
例えば次のような画像を考えます。

np.random.seed(0)  
A = (np.random.rand(15, 15) > 0.7) * 255  
A = A.astype(np.uint8)  


これの画像に対して、次のようにopeningの操作をおこないます。

kernel = np.ones([2, 2], np.uint8)  
dilation = cv2.dilate(A, kernel, iterations=1)  
erosion = cv2.erode(dilation, kernel, iterations=1)  
plt.imshow(erosion)  
plt.gray()  
plt.show()  

openingと同様に次のようにしてもclosingをおこなえます。結果は上記と全く同じになります。

closing = cv2.morphologyEx(A, cv2.MORPH_CLOSE, kernel)  
plt.imshow(closing)  
plt.gray()  
plt.show()  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@opqrstuvcutの技術とか技術以外のブログ 最近フリーランスになりました

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう