Image Inpainting
마스크, 세그멘테이션, OpenCV, YOLO26, 생성형 모델을 사용하여 이미지 인페인팅이 콘텐츠를 복원하거나 제거하는 방법과 주요 활용 사례 및 한계에 대해 알아보세요.
이미지 인페인팅은 누락되거나 손상되었거나 의도적으로 마스킹된 이미지 영역을 재구성하여 완성된 영역이 주변 환경과 자연스럽게 어우러지도록 하는 컴퓨터 비전 기술입니다. 불필요한 픽셀을 단순히 덮어쓰는 대신, 인페인팅 시스템은 인근 텍스처, 장면 구조, 그리고 생성형 시스템의 경우 학습된 시각적 패턴을 바탕으로 그럴듯한 대체 콘텐츠를 추정합니다. 일반적인 목적으로는 손상된 사진 복원, 객체나 텍스트 제거, 이미지 편집 중 발생한 빈 공간 채우기가 있습니다.
이미지 인페인팅 동작 원리#
인페인팅 워크플로에는 대개 원본 이미지와 교체할 픽셀을 식별하는 마스크라는 두 가지 입력이 사용됩니다. 시스템은 마스크 바깥쪽 픽셀을 보존하면서 안쪽 콘텐츠를 합성하거나 재구성합니다. 마스크 규칙은 도구마다 다르므로 개발자는 흰색, 검은색, 0 또는 0이 아닌 픽셀 중 어떤 것이 편집 가능한 영역을 나타내는지 확인해야 합니다.
전통적인 컴퓨터 비전 방법은 마스크 경계에서 안쪽으로 색상, 모서리, 텍스처를 전파합니다. 예를 들어 OpenCV image inpainting workflow는 주변 픽셀을 사용하여 마스크된 영역을 채우고 주변 구조를 이어 나가도록 설계된 알고리즘을 제공합니다. 이러한 접근 방식은 효율적이며 긁힘, 먼지, 얇은 텍스트, 작은 구멍에 자주 잘 작동합니다. (docs.opencv.org)
학습 기반 시스템은 더 높은 수준의 맥락을 추론합니다. 모델은 마스크된 영역이 벽돌 세공, 잔디, 의류 또는 사람의 얼굴에 걸쳐 있음을 인식하고 해당 해석과 일치하는 콘텐츠를 생성할 수 있습니다. 그러나 출력 결과는 알 수 없는 원본 픽셀의 복원이 아니라 그럴듯한 추정 결과입니다.
마스크 및 모델 접근 방식#
마스크 품질은 결과에 큰 영향을 미칩니다. 너무 작은 마스크는 객체 모서리나 그림자를 남길 수 있으며, 너무 큰 마스크는 유용한 맥락을 제거합니다. 정밀한 마스크는 수동으로 생성하거나 이미지 세분화를 통해 생성할 수 있습니다. 인스턴스 세분화는 각 객체에 대해 별도의 픽셀 수준 마스크를 생성하므로 특히 유용합니다.
Ultralytics SAM 2 documentation은 객체를 대화형으로 선택하기 위한 포인트 및 박스 프롬프트 기반 세분화를 설명합니다. 알려진 객체 클래스의 경우 Ultralytics YOLO segmentation task는 객체 마스크와 폴리곤 좌표를 반환합니다. 팀은 또한 수동, SAM 지원, YOLO 지원 주석을 지원하는 Ultralytics Platform annotation editor를 사용하여 폴리곤 마스크를 생성하고 정제할 수 있습니다.
실제 채우기 작업은 여러 모델 패밀리로 수행할 수 있습니다.
- 고전적 방법은 주변 픽셀, 윤곽선 또는 부드러운 명암 패턴을 확장합니다. scikit-image restoration API에는 마스크된 영역에 대한 바이하모닉 인페인팅이 포함되어 있습니다.
- **생성적 적대 신경망**은 생성자 네트워크와 판별자 네트워크 간의 경쟁을 통해 시각적으로 사실적인 완성본을 생성하는 방법을 학습합니다.
- **확산 모델**은 마스크 내부의 노이즈를 보이는 이미지 및 선택적 텍스트 프롬프트에 조건화된 콘텐츠로 반복적으로 변환합니다.
이미지 인페인팅 대 관련 작업#
인페인팅은 국소적 교체로 정의됩니다. 관련 작업은 다음과 같은 다른 목적을 가집니다.
- 객체 제거는 인페인팅의 한 응용 분야로, 세분화를 통해 객체를 선택하고 인페인팅으로 그 결과로 생긴 구멍을 채웁니다.
- 이미지 세분화는 어떤 픽셀이 객체나 클래스에 속하는지 식별하지만 교체하지는 않습니다.
- 디노이징은 일반적으로 장면 콘텐츠를 보존하면서 광범위한 노이즈를 줄입니다.
- 아웃페인팅은 내부 영역을 수리하는 대신 원본 캔버스 너머로 콘텐츠를 확장합니다. Google Cloud mask-based image editing guide는 콘텐츠 삽입, 제거, 확장, 교체를 구분합니다.
- 초해상도는 사용자 정의 마스크를 타겟팅하는 대신 이미지 해상도와 세부 정보를 높입니다.
텍스트 제거는 객체 제거와 동일한 워크플로를 따릅니다. 텍스트에 마스크를 적용한 다음 시스템이 가려진 배경을 예측합니다. 텍스트가 고유한 얼굴, 기호 또는 문서 세부 정보를 가리고 있는 경우 원래 정보를 안정적으로 복구할 수 없습니다.
실제 적용 사례#
소매 이미지 정리: 온라인 판매자는 제품 사진에서 불필요한 케이블, 반사, 지지대 또는 배경 객체를 세분화하고 해당 영역을 인페인팅할 수 있습니다. 작은 결함은 Adobe Content-Aware Fill에 적합할 수 있으며, Adobe generative image editing은 더 크고 의미적으로 복잡한 영역을 처리할 수 있습니다. (helpx.adobe.com)
이미지 복원: 기록 보관소 및 이미징 팀은 스캔한 사진과 현미경 프레임의 긁힘, 먼지 자국, 센서 결함 또는 누락된 픽셀에 마스크를 적용할 수 있습니다. 이는 가독성과 프레젠테이션을 향상시킬 수 있지만, 재구성된 영역을 관측된 증거로 취급해서는 안 됩니다. 의료, 과학 또는 법forensic 이미지에서는 가조된 구조가 해석을 바꿀 수 있으므로 명확하게 문서화해야 합니다.
실무 워크플로와 한계#
다음 예제에서는 YOLO26을 사용하여 사람 마스크를 생성하고 OpenCV로 해당 영역을 채웁니다. pip install ultralytics opencv-python numpy로 종속성을 설치합니다.
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo26n-seg.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Select the first detected person and convert its polygon to a mask.
class_ids = result.boxes.cls.cpu().numpy().astype(int)
person_index = next(i for i, class_id in enumerate(class_ids) if class_id == 0)
contour = result.masks.xy[person_index].astype(np.int32)
contour = contour.reshape(-1, 1, 2)
image = result.orig_img.copy()
mask = np.zeros(image.shape[:2], dtype=np.uint8)
cv2.drawContours(mask, [contour], -1, 255, cv2.FILLED)
inpainted = cv2.inpaint(image, mask, 3, cv2.INPAINT_TELEA)
cv2.imwrite("inpainted.jpg", inpainted)이는 객체 지역화와 building masks from segmentation contours에 대한 문서화된 패턴을 결합합니다. 고전적인 채우기 방식은 큰 객체, 반복되는 지오메트리, 그림자, 반사 또는 얼굴을 처리하는 데 어려움을 겪을 수 있습니다. 생성형 방법은 더 넓은 맥락을 처리하지만 제작된 세부 정보를 유입할 수 있습니다. 원본을 보존하고, 전체 해상도에서 경계를 검사하며, 특히 진위 여부가 중요한 경우 C2PA Content Credentials과 같은 출처 메커니즘을 사용하여 중요한 편집 사항을 기록하십시오. NIST guidance on synthetic-content transparency 역시 유의미하게 변경된 미디어에 대한 중요한 안전장치로서 출처와 라벨링을 강조합니다. (c2pa.org)






