LoginSignup
6
6

PythonとOpenCVで消しゴムマジックやってみた!

Posted at

:robot: 「消しゴムマジックで消してやるのさ」

少し前に、消しゴムマジックCMのこのセリフが流行っていました。
ちょうど私もGoogle Pixelを持っていたので実際に試してみると、本当に選択した範囲が消えるんですね~!感動です。
そんな消しゴムマジックを再現しよう!ということで、Inpaintingという技術を使用して再現をチャレンジしました。

例:空の鳥を消してみました(消しゴムマジック使用)
image.png

Inpaintingとは?

Inpaintingとは日本語で修復するという意味で、選択された範囲の画像を修復する技術のことです。
今回は、OpenCVのINPAINTを使用して再現を行いました。
この技術にAIなどを絡ませると、より精巧な修復が可能になるようです。
OpenCVにはInpaintingの方法がNSとTELEAの2種類あり、流体力学の理論を適用した画像の補完や、加重平均・勾配を使用して修復されるごとに境界を更新する方法などが用いられています。

参考:OpenCVで画像のInpaintingの解説

用意するもの

用意するものは2つです。

  • 画像
  • マスク画像

画像はpixabayというフリー画像サイトからお借りしました。
マスク画像というのは、消したい部分だけ塗りつぶされた画像のことです。こちらは既存の描画ツールを駆使して作成しました。結構大変でした。。。

左が元の画像で、右がマスク画像です
image.png

コード

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のradius20と100の比較
image.png

TELEAのradius20と100の比較
image.png

NSとTELEAの比較(radius100)
image.png

NSよりもTELEAのほうが比較的滑らかな修復ができている印象ですね。

感想

OpenCVを使うと少ないコードでも簡単に画像処理ができるのでとても便利でした。また、AIを組み合わせるともっと自然に修復ができるようなのでまだまだ深堀出来そうです。皆さんもぜひInpaintingを試してみてください! 

参考にしたサイト

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6