[Python] 이미지 워터마크 완벽 제거: OpenCV 인페인팅과 좌표 설정법

2026. 2. 4.

 

안녕하세요! 오늘은 이미지 속의 불필요한 워터마크나 로고를 흔적 없이 지우는 컴퓨터 비전 기술을 소개합니다. 포토샵의 '내용 인식 채우기' 기능을 파이썬 코드 몇 줄로 구현하는 방법, 지금 바로 시작합니다!

1. 핵심 개념: (x, y, w, h) 좌표 시스템

이미지에서 특정 영역을 지정할 때 우리는 사각형(Rectangle) 개념을 사용합니다.

  • x, y: 지우고자 하는 영역의 왼쪽 상단 시작점 좌표입니다.
  • w (Width): 시작점으로부터의 가로 너비입니다.
  • h (Height): 시작점으로부터의 세로 높이입니다.

이 네 가지 숫자만 있으면 이미지의 어떤 구석에 있는 워터마크라도 정밀하게 타격할 수 있습니다.


2. OpenCV 인페인팅(Inpainting)이란?

워터마크를 지운 자리는 텅 빈 구멍이 생깁니다. OpenCV의 인페인팅 기술은 이 구멍을 주변 픽셀의 색상과 무늬 흐름을 분석해 자연스럽게 메워주는 기술입니다. 픽셀을 단순히 복사하는 게 아니라, 주변과의 경계선을 부드럽게 이어주기 때문에 복원력이 매우 뛰어납니다.


3. 전체 파이썬 코드 (완성본)

이 코드는 지정한 (x, y, w, h) 영역을 '마스크'로 만들고, 인페인팅 알고리즘을 적용해 결과물을 출력합니다.

import cv2
import numpy as np

def remove_watermark_with_inpainting(image_path, x, y, w, h, output_path):
    # 1. 원본 이미지 불러오기
    img = cv2.imread(image_path)
    if img is None:
        print("이미지를 불러올 수 없습니다.")
        return

    # 2. 마스크(Mask) 이미지 생성
    # 원본과 동일한 크기의 검은색 도화지를 만듭니다.
    mask = np.zeros(img.shape[:2], dtype=np.uint8)

    # 3. 특정 영역(x, y, w, h)을 흰색으로 채우기
    # 이 흰색 영역이 바로 '지워질 부위'를 나타냅니다.
    mask[y:y+h, x:x+w] = 255

    # [Tip] 더 자연스러운 복원을 위해 마스크 영역을 2픽셀 정도 확장 (선택사항)
    kernel = np.ones((3,3), np.uint8)
    mask = cv2.dilate(mask, kernel, iterations=1)

    # 4. 인페인팅 알고리즘 적용
    # cv2.INPAINT_TELEA: 주변 픽셀 가중치 평균 방식 (강력 추천)
    # 3: 주변을 참고할 반경(Radius). 값이 클수록 더 넓은 범위를 참고합니다.
    result = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)

    # 5. 결과 저장 및 확인
    cv2.imwrite(output_path, result)

    # 화면에 비교 출력 (선택 사항)
    cv2.imshow('Original', img)
    cv2.imshow('Cleaned', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# --- 사용 예시 ---
# x=500, y=350 위치에서 가로 150, 세로 40 크기의 워터마크를 지우고 싶을 때
remove_watermark_with_inpainting(
    image_path='input_image.jpg', 
    x=500, y=350, w=150, h=40, 
    output_path='restored_image.jpg'
)

4. 코드 단계별 상세 설명

① 마스크(Mask)의 역할

인페인팅 함수는 "어디가 지워진 부분인지"를 알려주는 별도의 흑백 지도가 필요합니다.

  • 검은색(0): 보존할 영역 (원본 유지)
  • 흰색(255): 제거할 영역 (주변으로 채울 곳)
    우리는 mask[y:y+h, x:x+w] = 255 코드를 통해 워터마크 자리를 흰색으로 정확히 표시했습니다.

② 마스크 확장 (cv2.dilate)

워터마크의 테두리 부분에 미세한 잔상이 남는 경우가 많습니다. 이때 dilate 함수를 사용하여 지울 영역을 아주 살짝(1~2픽셀) 넓혀주면, 원본 워터마크의 흔적을 완전히 없애고 주변 배경과 더 부드럽게 섞이게 됩니다.

③ 인페인팅 알고리즘 (INPAINT_TELEA)

알렉산드루 텔레아(Telea) 방식은 지울 영역의 경계선부터 안쪽으로 들어가며 색을 채웁니다. 이때 주변 픽셀의 거리를 계산해 가중치를 주기 때문에, 배경에 복잡한 무늬가 있어도 그 결을 따라가는 효과를 줍니다.


5. 가장 완벽한 결과를 얻기 위한 팁!

  1. 정확한 좌표 찾기: 그림판이나 캡처 도구로 이미지를 열어 워터마크의 시작점(x, y)과 크기를 정확히 파악하세요.
  2. 반경(Radius) 조절: 코드의 inpaintRadius 값을 3에서 시작해 보세요. 만약 복원된 부위가 너무 뭉개진다면 1로 낮추고, 반대로 경계가 뚜렷하다면 5~10으로 높여보세요.
  3. 여러 번 시도: 배경이 매우 복잡하다면 한 번에 넓은 영역을 지우기보다, 작은 영역으로 나누어 여러 번 인페인팅을 적용하는 것이 더 자연스럽습니다.

마치며

이제 포토샵 없이도 파이썬과 OpenCV만 있으면 이미지의 워터마크를 완벽하게 제거할 수 있습니다.

특히 대량의 이미지 파일에서 동일한 위치의 로고를 지워야 할 때 이 코드는 최고의 자동화 도구가 될 것입니다.

 

 

댓글