본문 바로가기

일상

스캔한 서명을 배경 투명 PNG로 뽑기 (Python, PIL + numpy)

반응형

스캔하거나 캡처한 서명(또는 도장)을 흰 배경 없이 다른 문서에 얹고 싶을 때, 파이썬으로 배경만 투명하게 만드는 방법입니다.


1. 문제: 서명을 얹으면 흰 배경이 따라온다
종이에 한 서명을 스캔하거나 화면에서 캡처하면 흰 바탕 위에 검은 획이 있는 이미지가 됩니다. 이걸 계약서나 다른 이미지 위에 그대로 올리면 흰 사각형 배경이 같이 올라와서 뒤 내용을 가려 버립니다. 포토샵으로 일일이 지울 수도 있지만, 획 가장자리가 계단처럼 거칠어지기 쉽습니다. 파이썬으로 밝기 정보를 그대로 투명도로 바꾸면 가장자리까지 깔끔하게 뽑을 수 있습니다.


- 스캔/캡처 서명 = 흰 배경 + 검은 획
- 그대로 얹으면 흰 사각형이 뒤 내용을 가림
- 수작업으로 지우면 획 가장자리가 거칠어짐


2. 원리: 밝기를 그대로 투명도(알파)로 쓴다
서명 이미지는 획이 어둡고(0에 가까움) 배경이 밝습니다(255에 가까움). 그래서 이미지를 흑백(grayscale)으로 바꾼 뒤, 밝기를 뒤집어서 알파 값으로 쓰면 됩니다. 즉 어두운 획은 불투명하게, 밝은 배경은 투명하게 만드는 겁니다. 여기서 핵심은 알파를 0 아니면 255로 딱 자르지 않고(하드 임계값), 밝기에 비례하는 그라데이션으로 두는 것입니다. 그래야 획의 안티에일리어싱된 가장자리가 부드럽게 살아남습니다. 거의 흰색인 픽셀만 완전 투명(0)으로 처리해 배경 얼룩을 없앱니다.


- grayscale 밝기: 획 0에 가까움, 배경 255에 가까움
- 알파 = 255 - 밝기 (어두운 획 불투명, 밝은 배경 투명)
- 하드 임계값 대신 그라데이션 -> 획 가장자리 보존
- 거의 흰색(밝기 235 초과)만 완전 투명 처리


3. 서명 영역만 잘라내기
알파를 다 계산했으면 RGB는 검정으로 통일하고 알파 채널만 채워 RGBA 이미지를 만듭니다. 그런데 원본에는 서명 주변에 빈 여백이 많습니다. 불투명한 픽셀들의 바운딩박스를 구해서 그 영역만 여백을 조금 두고 잘라내면, 서명에 딱 맞는 크기의 투명 PNG가 나옵니다.


- RGB는 검정, 알파 채널만 채워 RGBA 구성
- 불투명 픽셀(알파 10 초과)의 바운딩박스 계산
- 여백 20px 정도 두고 크롭 -> 서명에 딱 맞는 투명 PNG


4. 정리
서명 배경을 투명하게 만드는 건 밝기를 그대로 투명도로 바꾸는 발상 하나면 끝납니다. 어두운 획은 불투명, 밝은 배경은 투명, 그리고 알파를 0/255로 자르지 않고 그라데이션으로 둬서 가장자리를 살리는 게 포인트입니다. 마지막에 불투명 영역만 크롭하면 어디에나 바로 얹을 수 있는 서명 PNG가 됩니다. 설치는 PIL(Pillow)과 numpy 두 개면 충분합니다.


- 알파 = 255 - 밝기로 배경 투명화(획은 불투명)
- 그라데이션 알파로 안티에일리어싱 가장자리 보존
- 불투명 바운딩박스로 크롭해 서명에 딱 맞게


여기까지 스캔한 서명을 배경 투명 PNG로 뽑는 방법에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!

반응형