[python] 사진 배경 제거 기능

chxxrin·2024년 11월 21일
0

python_playing

목록 보기
1/1

https://www.remove.bg/ko/upload

위의 웹서비스는 사진의 배경을 지워서 누끼를 따주는 서비스다.
동아리 홍보 자료 만들거나 PPT 만들 때 정말 편리하게 사용했는데,
어떤 코드로 짤 수 있는지 궁금해서 찾아보다가 엄청 간단한 코드를 발견했다!
근데 vscode 에서 짜려고 하니까 왜인지 자꾸 하나씩 에러가 나서
참고해서 코드를 조금 수정해봤다.
그리고 처음에는 사진 배경을 삭제를 하는데, 누끼가 아니라 배경이 지워지는 거라서
배경이 검은색이 되는 결과물이 나왔다.

내가 원하는건 그게 아닌데ㅠ
나는 누끼를 따고 싶단 말야!

우선 rembg 라이브러리를 사용하면 완전 간단하게 배경 제거가 된다는 걸 알게 되었다!!
너무 신기해!!

  • rembg : 배경제거를 위한 라이브러리다. 여기서 remove() 함수는 이미지에서 배경을 자동으로 제거하는 기능을 수행한다.
  • PIL : 이미지를 열고 저장할 수 있도록 도와주는 Python Imaging Library이다.
  • io: 이미지 데이터를 바이너리 형식으로 처리하기 위해 사용된다.

일단 매우매우 간단하게 vscode에서 실험을 해본거기 때문에 아직은 파일 경로를 직접 설정해줘야했다.
이 부분은 나중에 좀 더 개선해서 react랑 연동해서 파일을 drag or drop을 하면
배경제거가 된 파일을 다운받을 수 있게 해보고 싶다!

배경제거가 된 후의 이미지 데이터는 바이너리 형식으로 되고, 그 다음에는 바이너리 데이터를 이미지로 변환해줘야 한다.
그리고 내 결과 파일은 왜 검은색 배경이 나왔는지 알게 되었다...
처음에는 JPEG 포맷으로 결과물을 받았는데, JPEG는 투명 배경을 지원하지 않았던 것이었다,,
그래서 포맷만 PNG로 바꿨떠니 바로 투명 배경으로 다운로드 받을 수 있게 됐다.
사실 처음 안 사실,,

rembg

이 라이브러리는 처음 사용해보았는데, 알고보니 딥러닝 모델을 기반으로 하여 배경을 자동으로 제거해주는 라이브러리였다. 내부적으로 rembg는 U-2-Net이라는 모델을 사용하며 이미지에서 객체와 배경을 구분하는 학습된 신경망을 기반으로 동작한다고 한다.

나는 코드 한줄로 뚝딱했는데, 어떻게 제거가 되는지 궁금해서 찾아보니 다음과 같은 과정으로 진행된다고 한다.

  1. 입력 이미지가 모델에 전달된다.
  2. 모델은 이미지 내에서 주요 객체 (예: 사람, 동물 등)와 배경을 구분한다.
  3. 모델은 객체 영역을 유지하고, 배경 부분을 제거하여 투명하게 만든다.
  4. 결과적으로, 객체만 남고 배경은 제거된 이미지가 반환된다.

다만, 아직 부족한 점은 자동으로 배경을 제거해주긴 하는데, 배경과 비슷한 색상의 객체나 옷같은 경우 그거까지 다 삭제를 해버려서 인생네컷에서 하늘색 배경에서 하늘색 옷을 입고 찍었던 사진은 옷까지 날아가버렸다 ㅠㅠ
이 부분은 추가적인 보정이 필요할듯하다!!

아이폰에서는 그냥 꾸욱 누르면 짠하고 배경제거가 되는게 너무 신기했다ㅠㅠ
게다가 속도도 너무 빨라!!

그래도 넘 재미있는 시간이었다~~
다음엔 또 어떤걸 해보지

아래는 내 코드!!

from rembg import remove
from PIL import Image
import io

# 입력 및 출력 경로 설정
input_path = '손흥민.jpg'
output_path = '손흥민_remove.png'  # PNG 포맷으로 변경해야 투명 배경 가능!

try:
    # 입력 이미지 업로드
    with open(input_path, 'rb') as inp_file:
        input_data = inp_file.read()
    
    # 배경 제거해서 바이너리 데이터가 나옴
    output_data = remove(input_data)
    
    # 바이너리 데이터 -> 이미지 데이터 변환
    output_image = Image.open(io.BytesIO(output_data))
    
    # PNG 형식으로 파일 저장
    output_image.save(output_path, format="PNG")
    print(f"Completed: {output_path}")

except Exception as e:
    print(f"ERROR: {e}")


0개의 댓글

관련 채용 정보