반응형
온라인 쇼핑몰이나 블로그에 제품 이미지를 업로드할 때 깔끔한 배경은 필수입니다. 그러나 포토샵 같은 전문적인 도구는 배우기 어렵고 시간이 많이 소모될 수 있죠. 오늘은 파이썬으로 간단히 배경을 제거하고, 흰색 배경으로 바꾸는 방법을 소개합니다.

준비물
아래 라이브러리를 설치하세요.
pip install opencv-python numpy Pillow onnxruntime
pip install numba rembg
코드 설명
두 가지 방법을 제공합니다:
rembg: AI 기반의 자동 배경 제거
OpenCV GrabCut: 알고리즘 기반 배경 제거 (세부 조정 가능)
rembg를 이용한 배경 제거
rembg 라이브러리는 AI 모델을 통해 배경을 매우 정교하게 제거할 수 있습니다.
from rembg import remove, new_session
from PIL import Image
import gc
def remove_background_and_set_white(input_path, output_path, session=None, model_name="isnet-general-use"):
gc.collect()
if session is None:
session = new_session(model_name)
input_image = Image.open(input_path)
output_image = remove(input_image, session=session)
white_background = Image.new("RGBA", output_image.size, (255, 255, 255, 255))
white_background.paste(output_image, (0, 0), output_image)
final_image = white_background.convert("RGB")
final_image.save(output_path)
print(f"{output_path}에 저장되었습니다.")
OpenCV GrabCut으로 배경 제거하기
GrabCut은 이미지의 전경과 배경을 자동으로 분리하는 알고리즘입니다.
import cv2
import numpy as np
import gc
def remove_background_with_grabcut(input_path, output_path):
gc.collect()
img = cv2.imread(input_path)
mask = np.zeros(img.shape[:2], np.uint8)
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
rect = (50, 50, img.shape[1]-100, img.shape[0]-100)
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype("uint8")
img_fg = img * mask2[:, :, np.newaxis]
white_background = np.ones_like(img, np.uint8) * 255
alpha = mask2[:, :, np.newaxis]
result = img_fg + white_background * (1 - alpha)
cv2.imwrite(output_path, result)
print(f"{output_path}에 저장되었습니다.")
여러 이미지를 한번에 처리하기
폴더 내의 모든 이미지를 배경 제거하여 흰색으로 처리할 수 있습니다.
import os
from glob import glob
def batch_process_images(input_folder, output_folder, model_name="isnet-general-use"):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
image_files = glob(os.path.join(input_folder, "*.jpg")) + glob(os.path.join(input_folder, "*.jpeg")) + glob(os.path.join(input_folder, "*.png"))
session = new_session(model_name)
for image_path in image_files:
filename = os.path.basename(image_path)
output_path = os.path.join(output_folder, filename)
remove_background_and_set_white(image_path, output_path, session)
실행 방법
아래와 같이 폴더를 지정하여 한 번에 여러 이미지를 처리할 수 있습니다.
if __name__ == "__main__":
batch_process_images("inputs", "outputs")
이제 쉽고 빠르게 이미지 배경을 깔끔하게 만들어보세요!
728x90
반응형
BIG
댓글