본문 바로가기
카테고리 없음

파이썬을 활용한 이미지 배경 제거(누끼) 쉽게 따라하기

by Chan_찬 2025. 3. 13.
반응형

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

 

remove background

준비물

아래 라이브러리를 설치하세요.

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
Buy me a coffeeBuy me a coffee

댓글