Motive
OpenCVを使って長い動画を一部だけ保存する方法から政見放送の動画をデータセットとして画像処理してきたが、今回は inpaint
(画像修復)を使ってオブジェクト消去してみる。理由としては背景が単調で時刻のテロップと政党名のプラカード以外何も写っていないので修復が容易でないかと思ったためです。
Dataset
Method
マスク画像をあらかじめ作成し、修復(オブジェクト消去)したい箇所を白に塗り潰します。
そのあとに、
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
思った以上に処理ができました。
時刻や政党名が表示されていたとは思えないくらいです。
Future
開発メモ その69 OpenCV 3.2 with ContribモジュールでInpaintを使用する
を見るとC++にcv2.inpaint
よりも精度が高いfunctionがあるっぽいです。
もしかするとC++を使えば字幕がいい感じで消去できるかもしれません。