DilationとErosion

OpenCV By Output不足なエンジニア

前回の続きです。 今回は画素の膨張・縮小を操作するdilationとerosionについて記載します。といってもこれは簡単です。 2値化した画像に対し、白部分を膨張させたい場合はdilation, 白部分を縮小させたい場合はerosionを使用します。

実装例と調整方法

import cv2
import numpy as np
# 画像読み込みと2値化(グレースケールでも可)
img = cv2.imread('img.png', 0)
_, th_img = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# kernel定義と縮小膨張の実施
kernel   = np.ones((3,3),np.uint8)
dilation = cv2.dilate(th_img,kernel,iterations=1)
erosion  = cv2.erode(th_img,kernel,iterations=1

kernelについては、細かい調整が必要であれば考察が必要ですが、単純に膨張縮小したいだけであれば全要素が1の(N,N)行列を渡せばよいです。実行してみて思ったより変化が少ない場合はkernelのサイズを大きくするか、iterationsを増やすことで対応できます。フリー画像で試すとこんな感じです。

1枚目が通常の画像(を説明のために白黒反転させたもの)です。2枚目がdilationした結果で、白領域が膨張しています。3枚目がerosionした結果で逆に白領域が縮小しています。

用途例

前回のフーリエ変換を用いたノイズ除去とは別に、erosionして小さな点を除外してからdilationすることでノイズ除去する方法もあります。openingといい、cv2.morphologyEx関数で実行できます。
2画像の同一箇所を削除する際はあらかじめdilationして重なりやすくしてから差分を取って、erosionすることで、多少の誤差なら許容することができます。RIPOCの精度を高める努力も大事ですが、工数を考えるとこの強引な手法もありかなと思います。(但し、kernelサイズとiteration回数というパラメタが増えます…)

しかし画像を挿入するとトップにでかい画像が表示されるの何とかしないとな…幽霊船みたい(汗


カテゴリー:OpenCV,python,画像処理

Output不足なエンジニア

統計が好きになれず、機械学習やったら必然的に統計が必要になるだろうと思ったら想像以上に機械学習にハマる。数学は芸術なので商売にするつもりはないけど、DeepLearningは数学じゃないし商売にしたいと思っているところ。画像処理がメイン。