はじめに
スキャンされた写真からごみや傷を除去したり,静止画や動画から不要な物体を削除したりするというのをOpenCVとPythonを使ってプログラムでやってみます。
今回は、電線を消してみます。
cv2.inpaint
inpaint(src, inpaintMask, inpaintRadius, flags[, dst]) -> dst
入力画像にマスクを適用し、マスク部分をマスク境界周囲の画像をもとに内側に向かって補間してくれます。
- src - 入力画像.8ビット,1あるいは3チャンネル.
- inpaintMask - マスク.8ビット,1チャンネルの修復マスク.非0のピクセルが,修復が必要な領域を表します.
- inpaintRadius - 修復される各点を中心とする近傍円形領域の半径.この領域が,アルゴリズムに考慮されます.
-
flags - 修復手法.以下のいずれかです:
- INPAINT_NS - ナビエ・ストークス(Navier-Stokes)ベースの手法.
- INPAINT_TELEA - Alexandru Telea による手法.
プログラム
# -*- coding: utf-8 -*-
import cv2
# オリジナル画像
img = cv2.imread('img.jpg')
# マスク
mask = cv2.imread('mask.png',0)
# 画像補正
dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
#dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_NS)
# 表示
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存
cv2.imwrite('result.jpg', dst)
OpenCV : 3.1.0
Python : 3.5.2
OpenCVとPython環境の構築は、こちらを参考にしてください。(リンク)
おわりに
マスクの周囲のピクセルからマスク内の画素を補間していくため、マスクの周囲が比較的フラットな感じの画像だとうまくいきます。逆に、周囲が複雑なパターンだと、うまくいきません。
マスクは、消したい部分をマスクしきれていないと、ノイズが現れます。また、マスクの形状に問題があると、マスク部分がすかしのように現れてしまうことがありました。
PhotoShopでも同じような画像操作が可能ですが、手動で行うことになります。OpenCVを使えば、プログラムの中で行うことができるため、動画への適用も可能になってきます。プライバシー保護のため、動画内の人を自動的に抽出し、その部分を今回の方法で自動的に補完するようなことも使えそうです。