안녕하세요! 오늘은 이미지 속의 불필요한 워터마크나 로고를 흔적 없이 지우는 컴퓨터 비전 기술을 소개합니다. 포토샵의 '내용 인식 채우기' 기능을 파이썬 코드 몇 줄로 구현하는 방법, 지금 바로 시작합니다!
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. 가장 완벽한 결과를 얻기 위한 팁!
- 정확한 좌표 찾기: 그림판이나 캡처 도구로 이미지를 열어 워터마크의 시작점(x, y)과 크기를 정확히 파악하세요.
- 반경(Radius) 조절: 코드의
inpaintRadius값을3에서 시작해 보세요. 만약 복원된 부위가 너무 뭉개진다면1로 낮추고, 반대로 경계가 뚜렷하다면5~10으로 높여보세요. - 여러 번 시도: 배경이 매우 복잡하다면 한 번에 넓은 영역을 지우기보다, 작은 영역으로 나누어 여러 번 인페인팅을 적용하는 것이 더 자연스럽습니다.
마치며
이제 포토샵 없이도 파이썬과 OpenCV만 있으면 이미지의 워터마크를 완벽하게 제거할 수 있습니다.
특히 대량의 이미지 파일에서 동일한 위치의 로고를 지워야 할 때 이 코드는 최고의 자동화 도구가 될 것입니다.
'디자인 인사이트 > 동영상 만들기' 카테고리의 다른 글
| 구글 노트북LM 한국어 목소리 바꾸기 완벽 가이드 (feat. 일레븐랩스 & 무료 RVC 코랩) (0) | 2026.02.26 |
|---|---|
| [Python+FFmpeg] 내 마음대로 설계하는 자동 영상 제작 스크립트 만들기 (0) | 2026.02.04 |
| [Python] PDF 워터마크 제거 완벽 가이드 (배경색 자동 감지) (0) | 2026.02.04 |
| 슬라이드 강의·해설 영상에서 Python으로 장면 전환 자동 추출하기 (0) | 2026.02.04 |
| "열심히 만들었는데 소리가 작대요ㅠㅠ" 유튜브가 좋아하는 '최종 음량' 맞추는 법 (리미터 & LUFS) (0) | 2026.01.22 |
댓글