본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 05. 31. 16:28

Gemini 이미지의 반투명 워터마크를 reverse alpha blending으로 생각하기

요약

Gemini 이미지의 반투명 워터마크를 수학적인 역 알파 블렌딩(reverse alpha blending) 방식으로 제거하는 기술적 접근법을 다룹니다. 단순 인페인팅 대신 합성 공식을 역산하여 원본 화소를 복원하는 원리와 구현 시 고려해야 할 변수들을 설명합니다.

핵심 포인트

  • 알파 블렌딩 공식을 역산하여 원본 배경 화소(C_bg)를 계산 가능
  • 단순 인페인팅보다 수학적 복원이 배경 세부 사항 유지에 유리함
  • 리사이즈, JPEG 압축, 위치 오차 등 실제 구현 시의 변수 고려 필요
  • 수학적 복원 후 잔여 에지 부분만 보정하는 설계 방식 제안

Gemini와 같은 생성 AI 이미지에는 오른쪽 하단에 반투명한 가시적 워터마크 (visible watermark)가 들어가는 경우가 있습니다. 이 기사에서는 그것을 단순한 "방해되는 로고"가 아니라, 이미지 처리의 문제로 보았을 때 어떻게 정리할 수 있는지에 대해 메모합니다.

참고한 것은 Allen Kuo 님의 다음 기사입니다.

저도 브라우저에서 직접 다뤄볼 수 있는 형태의 실험용 UI를 준비했습니다.

이 기사는 기술 메모입니다. 본인이 권리를 가진 이미지, 또는 이용 허가가 있는 이미지만을 대상으로 하십시오. 가시적 워터마크를 지운다고 해서 이미지에 포함된 이력 정보나 불가시 워터마크 (invisible watermark)까지 지워진다는 보장은 없습니다.

반투명 로고는 대부분 alpha blending (알파 블렌딩)으로 합성되어 있습니다. 1픽셀 단위로 보면 대략 다음과 같은 식입니다.

C_obs = alpha * C_logo + (1 - alpha) * C_bg
  • C_obs: 실제로 보이는 화소 (pixel)
  • C_logo: 로고 측의 화소
  • C_bg: 원본 이미지 측의 화소
  • alpha: 투명도

알고 싶은 것은 C_bg입니다. C_logo와 alpha를 알고 있다면 식을 변형할 수 있습니다.

C_bg = (C_obs - alpha * C_logo) / (1 - alpha)

즉, 워터마크 제거는 반드시 "주변과 비슷하게 칠하는 것"뿐만 아니라, 합성된 식을 역방향으로 푸는 문제로 다룰 수 있습니다.

구현의 핵심만 뽑아내면 이 정도로 단순합니다.

const clamp8 = (v: number) => Math.max(0, Math.min(255, Math.round(v)));
function reverseAlphaBlend(observed: number, logo: number, alpha: number) {
if (alpha <= 0) return observed;
...

RGB라면 각 채널에 동일한 처리를 가합니다.

type RGB = { r: number; g: number; b: number };
function restorePixel(obs: RGB, logo: RGB, alpha: number): RGB {
return {
...

실제로는 여기에 로고 위치, alpha map (알파 맵), 색 공간 (color space), JPEG 압축, 리사이즈 후의 어긋남 등이 더해집니다. 식은 간단해도 제품으로서 안정화하는 부분은 거기서부터 시작됩니다.

reverse alpha blending (역 알파 블렌딩)의 재미있는 점은, 제대로 맞추면 상당히 정확하지만 전제가 조금만 어긋나도 금방 잔상이 남는다는 것입니다.

예를 들어 다음과 같은 케이스입니다.

  • 워터마크 위치가 몇 픽셀(px) 어긋나 있음
  • 이미지가 SNS나 스크린샷을 통해 리사이즈됨
  • JPEG 재압축으로 경계 부근의 값이 변함
  • 로고의 alpha profile (알파 프로파일)이 버전에 따라 다름

이 경우 식 자체는 올바르더라도 입력하는 alpha나 C_logo가 틀리기 때문에, 결과적으로 옅은 그림자나 반전된 듯한 흔적이 남습니다.

여기서 단순한 전면 인페인팅 (inpainting)을 수행하면 배경의 세부 사항까지 흐려지기 쉽습니다. 개인적으로는 먼저 수학적으로 되돌릴 수 있는 부분을 되돌리고, 남은 에지 (edge) 부분만 작게 보정하는 설계가 다루기 쉽다고 느꼈습니다.

웹 앱으로서 다룰 수 있게 만들면 CLI 도구와는 다른 제약이 있습니다.

  • 사용자는 반드시 대상 위치를 정확히 알지 못함
  • 이미지 크기나 압축 상태가 상당히 제각각임
  • 브라우저상에서는 처리 시간과 메모리를 억제해야 함
  • 실패했을 때 "어디가 대상 영역이었는지" 보여줄 필요가 있음

따라서 UI로는 다음과 같은 흐름이 이해하기 쉽습니다.

  • 이미지를 불러온다
  • 자동 검출이 가능한 경우 후보 영역을 보여준다
  • 제대로 검출되지 않는 경우 사용자가 브러시나 사각형으로 영역을 지정한다
  • reverse alpha blending 또는 inpainting 계열의 처리를 적용한다
  • 처리 전후를 비교하여 다운로드한다

제 사이트에서는 더 일반적인 케이스에도 사용할 수 있도록 영역 지정과 AI 보완에 가까운 UI로 구성했습니다.

1 - alpha로 나누기 때문에 alpha가 1에 가까우면 값이 튀게 됩니다. 실용적으로는 임계값 (threshold)을 두어 무리하게 복원하지 않고 별도의 처리에 넘기는 것이 안전합니다.

어떤 색 공간에서 합성되었느냐에 따라 역산 결과가 달라집니다. 브라우저의 Canvas에서 다룬다면 우선 sRGB를 전제로 구현하고, 결과를 보면서 조정하는 것이 현실적이었습니다.

AI 보완 (AI Completion)은 편리하지만, 배경의 디테일도 바꾸어 버립니다. alpha map의 에지 (edge)나 잔상이 나타나기 쉬운 부분에만 마스크를 만들어, 그 부분만 보정하는 것이 더 자연스럽습니다.

이미지 처리는 100% 성공하지 않습니다. 실패했을 때 「처리 대상 범위」, 「처리 전후의 차이 (difference)」, 「다시 시도하기 쉬운 조작」을 보여주는 것만으로도 사용자 경험은 상당히 달라집니다.

Gemini와 같은 반투명 워터마크는 이미지 처리 관점에서 보면 alpha blending의 역문제 (inverse problem)로 정리할 수 있습니다.

  • 로고 이미지와 alpha map을 알 수 있다면, 식으로 역산할 수 있다
  • 위치나 투명도가 어긋나면 잔상이 생긴다
  • 리사이즈 (resize)나 재압축 후에는 수학적 복원만으로는 부족할 때가 있다
  • Web UI에서는 자동 탐지뿐만 아니라, 수동 지정과 실패 시의 재조정이 중요하다

단순히 「지우는 것」이 아니라, 어디까지를 수식으로 되돌리고 어디서부터를 보완 (completion)으로 다룰지를 나누니 구현의 전망이 상당히 좋아졌습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0