LoginSignup
5
2

More than 3 years have passed since last update.

画像修復(inpaint)を使ってオブジェクト消去したった(OpenCV:Python)

Last updated at Posted at 2020-01-08

Motive

OpenCVを使って長い動画を一部だけ保存する方法から政見放送の動画をデータセットとして画像処理してきたが、今回は inpaint(画像修復)を使ってオブジェクト消去してみる。理由としては背景が単調で時刻のテロップと政党名のプラカード以外何も写っていないので修復が容易でないかと思ったためです。

Dataset

ここでは動画ではなく下記の一枚のキャプチャを使います。
capture_1.png

Method

マスク画像をあらかじめ作成し、修復(オブジェクト消去)したい箇所を白に塗り潰します。

mask1.png mask2.png

そのあとに、
cv2.inpaint(src,mask,1,cv2.INPAINT_TELEA)
を使って処理します。

Development

import cv2
import os
import numpy as np

def inpaint(src,top,bottom):
    mask = np.zeros((*src.shape[:-1],1), dtype=np.uint8)
    mask = cv2.rectangle(mask, 
                        top, 
                        bottom, 
                        color=(255,255,255), 
                        thickness=cv2.FILLED
                        )
    dst = cv2.inpaint(src,mask,1,cv2.INPAINT_TELEA)
    return dst


if __name__ == '__main__':

    window_name = "Drop Out NHK"

    mat = cv2.imread("capture_1.png")
    mat = cv2.resize(mat, None, fx = 0.5, fy = 0.5)

    dst = inpaint(mat,(200,40),(440,110))
    dst = inpaint(dst,(40,25),(115,65))

    cv2.imshow(window_name, dst)
    cv2.waitKey(0)
    cv2.destroyWindow(window_name)  

Result

output_inpaint.png

思った以上に処理ができました。:sweat_smile:
時刻や政党名が表示されていたとは思えないくらいです。

Future

開発メモ その69 OpenCV 3.2 with ContribモジュールでInpaintを使用する
を見るとC++にcv2.inpaintよりも精度が高いfunctionがあるっぽいです。
もしかするとC++を使えば字幕がいい感じで消去できるかもしれません。

Reference

5
2
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
5
2