LoginSignup
19
18

More than 5 years have passed since last update.

OpenCVとPythonで画像の自動補間(Fast Marching Method, Navier-Stokes)

Last updated at Posted at 2016-09-27

はじめに

 スキャンされた写真からごみや傷を除去したり,静止画や動画から不要な物体を削除したりするというのをOpenCVとPythonを使ってプログラムでやってみます。

今回は、電線を消してみます。

◎ 入力画像
img.jpg

◎ マスク
mask.jpg

◎ 結果
result.jpg

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 による手法.

プログラム

inpaint.py
# -*- 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を使えば、プログラムの中で行うことができるため、動画への適用も可能になってきます。プライバシー保護のため、動画内の人を自動的に抽出し、その部分を今回の方法で自動的に補完するようなことも使えそうです。

19
18
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
19
18