Featured image of post 膨張と収縮の組み合わせによるopeningとclosing

膨張と収縮の組み合わせによるopeningとclosing

本記事はQrunchからの転載です。


画像に対する膨張と収縮の組み合わせによって、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()
comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。