「消しゴムマジックで消してやるのさ」
少し前に、消しゴムマジックCMのこのセリフが流行っていました。
ちょうど私もGoogle Pixelを持っていたので実際に試してみると、本当に選択した範囲が消えるんですね~!感動です。
そんな消しゴムマジックを再現しよう!ということで、Inpaintingという技術を使用して再現をチャレンジしました。
Inpaintingとは?
Inpaintingとは日本語で修復するという意味で、選択された範囲の画像を修復する技術のことです。
今回は、OpenCVのINPAINTを使用して再現を行いました。
この技術にAIなどを絡ませると、より精巧な修復が可能になるようです。
OpenCVにはInpaintingの方法がNSとTELEAの2種類あり、流体力学の理論を適用した画像の補完や、加重平均・勾配を使用して修復されるごとに境界を更新する方法などが用いられています。
用意するもの
用意するものは2つです。
- 画像
- マスク画像
画像はpixabayというフリー画像サイトからお借りしました。
マスク画像というのは、消したい部分だけ塗りつぶされた画像のことです。こちらは既存の描画ツールを駆使して作成しました。結構大変でした。。。
コード
import numpy as np
import cv2
img = cv2.imread('元の画像.png')
mask = cv2.imread('マスク画像.png',0)
np.int8(mask)
dst = cv2.inpaint(img,mask,20,cv2.INPAINT_TELEA)
# dst = cv2.inpaint(img,mask,20,cv2.INPAINT_NS)
cv2.imwrite('ファイル名.png', dst)
inpaintの引数説明
cv2.inpaint(image, mask, radius, method)
cv2.inpaint(元の画像, マスク画像, 画像修復の半径, NSかTELEA選択)
修復半径を変えたりNSとTELEAを両方試したりするのもいいですね。
結果の比較
NSよりもTELEAのほうが比較的滑らかな修復ができている印象ですね。
感想
OpenCVを使うと少ないコードでも簡単に画像処理ができるのでとても便利でした。また、AIを組み合わせるともっと自然に修復ができるようなのでまだまだ深堀出来そうです。皆さんもぜひInpaintingを試してみてください!
参考にしたサイト