이미지 복구 (inpaint)를 사용하여 객체 지우기 (OpenCV : Python)

Motive



OpenCV를 사용하여 긴 동영상을 일부만 저장하는 방법 으로부터 마사미 방송의 동영상을 데이터 세트로서 화상 처리해 왔지만, 이번은 inpaint (이미지 수복)를 사용해 오브젝트 소거해 본다. 이유로는 배경이 단조롭고 시간의 텔롭과 정당명의 플래카드 이외 아무것도 찍히지 않았기 때문에 수리가 쉽지 않을까 생각했기 때문입니다.

Dataset



여기에서는 동영상이 아닌 아래의 한 장의 캡처를 사용합니다.


Method



마스크 이미지를 미리 작성하고 수리(오브젝트 삭제)하고 싶은 부분을 흰색으로 칠합니다.







그 후,cv2.inpaint(src,mask,1,cv2.INPAINT_TELEA)를 사용하여 처리합니다.

개발


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++를 사용하면 자막이 좋은 느낌으로 지울 수 있을지도 모릅니다.

Reference


  • 이미지 Inpainting - opencv-python
  • 개발 노트 69 OpenCV 3.2 with Contrib 모듈에서 Inpaint 사용
  • OpenCV 3.4 + Python3 이미지를 단색으로 채우기
  • 좋은 웹페이지 즐겨찾기