BETA

OpenCV生活25日目 inpaintで画像の修復をする

投稿日:2020-07-31
最終更新:2020-07-30

画像に汚れがついたり、傷がついているケースの修復には、最近ではディープラーニングを使った手法が色々出ていますが、画像処理の範囲でもできることがあります。
今回はOpenCVで修復をおこなってみます。

OpenCVでやってみる

次の画像にノイズをのせていきます。

次のようなコードで画像にノイズをのせていきます。

cv2.rectangle(img, (100,100),(300,105),(255,255,255), -1)  
cv2.rectangle(img, (400, 450),(600,460),(255,255,255), -1)  
cv2.rectangle(img, (0, 750),(800, 760),(255,255,255), -1)  
plt.imshow(img[:, :, ::-1])  
plt.show()  

mask = np.zeros(img.shape[:2], dtype=np.uint8)  
cv2.rectangle(mask, (100,100),(300, 105),(255), -1)  
cv2.rectangle(mask, (400, 450),(600,460),(255), -1)  
cv2.rectangle(mask, (0, 750),(800, 760),(255), -1)  
plt.imshow(mask)  
plt.gray()  
plt.show()  

ノイズがのった画像          ノイズ部分のmask画像

OpenCVのinpaint関数を使うと、このノイズがのった画像をある程度復元できます。
次のように利用します。

inpainted = cv2.inpaint(img, mask, 3, cv2.INPAINT_NS)  

第一引数に復元したい画像を指定し、第二引数に復元したい箇所をあらわしたマスク画像を指定します。第三引数が復元時に周辺のピクセルをいくつ利用するかを指定します。第四引数に復元のアルゴリズムを指定します。INPAINT_NS(Navier Stokes法)かINPAINT_TELEA(Alexandru Telea法)を指定できます。

Navier Stokes法           Alexandru Telea法

どちらも結構いい感じに復元できています。右図のほうが文字の部分などはきれいに復元できている気がします。

ちなみにAlexandru Telea法で第三引数を10まで大きくしてみると、以下のようになります。

ちょっと復元した箇所が滲んだような感じになってしまってます。大きくしすぎには注意ですね。

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

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

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

よく一緒に読まれる記事

0件のコメント

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