IMAGE inpaint

Mechboy·2024년 9월 22일
0

OPENCV

목록 보기
9/9

IMAGE inpaint

IMAGE inpainting의 정의

  • image inpainting 기술은 손상된 부분을 복원 하는 영상처리 기술
  • 이미지의 특정부분을 복원 하기 위해서 복원이 필요한 부분의 주변 픽셀 정보를 참고하여 유사한 정보를 복원한다.
  • 이때 마스크 Layer 를 활용하여 이미지 복원 영역을 지정하여 해당 영역을 기준으로 진행함

    (좌측: mask layer, 우측: 오리지널 이미지)

inpaint

inpaint()

  • Opencv에서 활용되는 image inpaint 매소드
    dst = cv2.inpaint(src, inpaintMask, inpaintRadius, flags)

    dst: 복원이 완요된 이미지를 저장하기 위한 변수
    src : 복원이 필요한 이미지
    inpaintMask : 복원이 필요한 영역을 지정한 마스크
    inpaintRadius : 복원을 진행할때 참고 하는 영역, 일반적으로는 적은 반경을 참고 할 수록 복원이미지에서 blur효과가 적어진다.
    flags: INPAINT_NS (Navier-Stokes based method) 혹은 INPAINT_TELEA (Fast marching based method)

inpainting flag에 대한 추가 설명

1. Navier-Stokes equations

수학적 설명이 필요한 경우에는 아래 논문을 참고
Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting

  • 해당 방법은 나비에 스토크스 방정식으로 계산하기 위해 이미지를 표현하는 정보를 하나의 field로 생각하여 접근함.

2. Fast Marching Method

수학적 설명이 필요한 경우에는 아래 논문을 참고
An Image Inpainting Technique Based on the Fast Marching Method

  • 복원이 필요한 영역의 경계부분부터 시작하여 중심부까지 순차적으로 진행하는 방법.

inpaint 구현

  • 외장 모듈 불러오기
import cv2
import numpy as np
import matplotlib.pyplot as plt
  • 이미지 불러오기
# Read image in color mode.
filename = "images/Lincoln.jpg"
img = cv2.imread(filename, cv2.IMREAD_COLOR)

# If image is not read properly, return error.
if img is None:
    print('Failed to load image file: {}'.format(filename))
  • 이미지 불러오기
# Read image in color mode.
filename = "images/Lincoln.jpg"
img = cv2.imread(filename, cv2.IMREAD_COLOR)

# If image is not read properly, return error.
if img is None:
    print('Failed to load image file: {}'.format(filename))
  • 이미지 및 복사 및 마스크 레이어 생성
# Create a copy of original image.
img_mask = img.copy()
# Create a black copy of original image, acts as a mask.
inpaintMask = np.zeros(img.shape[:2], np.uint8)
  • 이미지 복원
while True:
    ch = cv2.waitKey()
    if ch == 27:
        cv2.destroyAllWindows()
        break
    if ch == ord('t'):
        # Use Algorithm proposed by Alexendra Telea: Fast Marching Method (2004).
        res_FMM = cv2.inpaint(src=img_mask, inpaintMask=inpaintMask, inpaintRadius=3, flags=cv2.INPAINT_TELEA)
        cv2.imshow('Inpaint Output using FMM', res_FMM)
    if ch == ord('n'):
        res_NS = cv2.inpaint(src = img_mask, inpaintMask = inpaintMask, inpaintRadius=3, flags=cv2.INPAINT_NS)
        cv2.imshow('Inpaint Output using NS Technique', res_NS)
    if ch == ord('r'):
        img_mask[:] = img
        inpaintMask[:] = 0
        sketch.show()
  • 마스크는 사전에 생성한 것으로 활용
  • 해당 모델을 활용하면 칼자국과 같은 흠집영역을 복원 할 수 있는것으로 확인 가능
  • 그러나 해당 모델도 한계가 있음. 복원이 필요한 영역의 넓이가 클수록 내부로 들어가면 참고 할 수 있는 원본이미지 정보가 한정되어 있기에 한계가 존재

결론

  • 얇은 선과 같은 형태로 생긴 손상은 기존 FMM이나 NS방식으로 복원을 해도 효과는 있음
  • 복원 영역이 넓어질수록 기존 방법에서는 한계가 있기 때문에 신경망 모델이나 다른 모델을 활용할 필요가 있음

복원시도 전

복원시도 후

profile
imageprocessing and Data science

0개의 댓글

관련 채용 정보