Python

블로그 사진 편집 자동화: 이미지 리사이징 및 얼굴 가리기

블로그 사진 편집 자동화(이미지 리사이징 및 얼굴 가리기)

블로그에 사진을 첨부하기 전에 저는 보통 2가지 작업을 합니다.

 

첫번째는 용량을 줄이기 위해 이미지 크기를 축소합니다. 갤럭시 S23울트라의 경우 3000 X 4000 픽셀인데 사이즈를 40% 축소(1200 X 1600)하면 용량이 확연히 줍니다. 이는 용량부담(=돈) 감소와 로딩속도 향상으로 이어져 검색사이트에 좋은 점수를 받는 요인이 됩니다.

 

두번째는 사진 속 사람 얼굴에 스티커를 붙여 가려줍니다. 내 얼굴도 공개하기 싫고 또한 다른 사람 얼굴도 불필요하게 담는것도 좋지 않은것 같아서입니다.

 

이 2가지 작업은 간단하지만 수작업으로 해야하고 꽤 귀찮은 일입니다. 그런데 이러한 작업을 클릭한번으로 자동으로 처리할 수 있는 코드를 소개하고자 합니다.

 

이미지 용량 자동 축소 기능

▷ 이미지 크기를 지정된 비율로 자동 축소하여 파일 용량 감소 ▷ 블로그나 웹사이트 업로드 시 빠른 로딩 속도 확보 및 저장 공간 효율 증대

 

고화질 이미지는 보기에는 좋지만, 웹사이트나 블로그에 업로드할 때 로딩 속도를 느리게 만들고 서버 공간을 많이 차지하는 원인이 됩니다.

 

이 파이썬 코드는 `cv2.resize` 함수를 사용하여 이미지의 가로, 세로 크기를 사용자가 지정한 비율로 줄여줍니다. 예를 들어, `scale_percent=40`으로 설정하면 이미지의 크기가 원래의 40%로 축소되어 파일 용량이 크게 줄어듭니다. 이를 통해 블로그나 웹사이트에 이미지를 더욱 빠르고 효율적으로 게시할 수 있습니다.

정면 및 측면 얼굴 자동 인식 및 스티커 부착 기능

▷ 하르 캐스케이드 분류기를 사용하여 이미지 속 정면 및 측면 얼굴 자동 감지 ▷ 인식된 얼굴 영역에 사용자가 지정한 스티커 이미지 자동 합성 ▷ 여러 장의 사진에 일괄적으로 스티커를 적용하여 편집 시간 단축
이 스크립트의 핵심 기능 중 하나는 사진 속 얼굴을 자동으로 인식하고 스티커를 부착해주는 것입니다. `cv2.CascadeClassifier`를 사용하여 미리 학습된 하르 캐스케이드 XML 파일을 로드하여 이미지에서 얼굴을 찾습니다.

 

특히, 정면 얼굴뿐만 아니라 측면 얼굴까지 인식할 수 있도록 두 개의 캐스케이드 분류기(`haarcascade_frontalface_default.xml`, `haarcascade_profileface.xml`)를 사용한 것이 특징입니다. 얼굴이 감지되면 해당 영역에 `PIL (Python Imaging Library)`을 이용하여 사용자가 지정한 스티커 이미지를 자동으로 합성해줍니다. 여러 장의 사진에 동일한 스티커를 일괄적으로 적용해야 할 때 매우 유용하며, 재미있는 사진 편집을 손쉽게 만들 수 있도록 도와줍니다.

 

간단한 사용 방법

▷ `raw_img` 폴더에 원본 이미지 파일을 저장 ▷ `smile.png` 파일을 스티커 이미지로 준비 ▷ `process_images` 함수 호출 시 원본 폴더, 결과 폴더, 스티커 파일 경로를 지정 ▷ 실행 후 `pre_img` 폴더에서 처리된 이미지 확인
위 파이썬 코드를 사용하는 방법은 매우 간단합니다. 먼저 편집하고자 하는 원본 이미지 파일들을 `raw_img`라는 폴더에 넣어주세요. 그리고 얼굴에 붙일 스티커 이미지 (예: `smile.png`) 파일을 준비합니다. 스크립트 내의 `process_images` 함수를 호출할 때, 원본 이미지 폴더 경로 (`folder_path`), 결과 이미지를 저장할 폴더 경로 (`output_folder`), 그리고 스티커 이미지 파일 경로 (`sticker_path`)를 적절하게 설정해주면 됩니다. 스크립트를 실행하면, 원본 이미지들이 자동으로 리사이징되고 얼굴이 인식되어 스티커가 부착된 후 `pre_img` 폴더에 저장됩니다.

 

Python
import cv2
import os
from PIL import Image

# 하르 캐스케이드 파일 경로
face_cascade_front = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_cascade_side = cv2.CascadeClassifier('haarcascade_profileface.xml')

def process_images(folder_path, output_folder, sticker_path, scale_percent=40):
    """
    폴더 내 이미지 파일의 크기를 축소하고 얼굴(정면, 측면)에 스티커를 추가합니다.

    Args:
        folder_path (str): 이미지 파일이 있는 폴더 경로
        output_folder (str): 처리된 이미지를 저장할 폴더 경로
        sticker_path (str): 스마일 스티커 이미지 파일 경로
        scale_percent (int, optional): 이미지 축소 비율 (기본값: 40)
    """

    # 스티커 이미지 로드
    sticker = Image.open(sticker_path)

    # 출력 폴더 생성 (없을 경우)
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 폴더 내 모든 이미지 파일 처리
    for filename in os.listdir(folder_path):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            image_path = os.path.join(folder_path, filename)
            image = cv2.imread(image_path)

            if image is None:
                print(f"이미지 로드 실패: {image_path}")
                continue

            # 이미지 크기 축소
            width = int(image.shape[1] * scale_percent / 100)
            height = int(image.shape[0] * scale_percent / 100)
            dim = (width, height)
            resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)

            # 얼굴 인식 (정면 및 측면)
            gray = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY)
            faces_front = face_cascade_front.detectMultiScale(gray, 1.3, 5)
            faces_side = face_cascade_side.detectMultiScale(gray, 1.3, 5) # 측면 얼굴 인식

            # 얼굴에 스티커 추가
            pil_image = Image.fromarray(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
            for (x, y, w, h) in faces_front:
                resized_sticker = sticker.resize((w, h))
                pil_image.paste(resized_sticker, (x, y), resized_sticker)
            for (x, y, w, h) in faces_side: # 측면 얼굴 스티커 추가
                resized_sticker = sticker.resize((w, h))
                pil_image.paste(resized_sticker, (x, y), resized_sticker)

            # 처리된 이미지 저장
            output_path = os.path.join(output_folder, filename)
            pil_image.save(output_path)

            print(f"처리 완료: {output_path}")

# 사용 예시
folder_path = "raw_img"
output_folder = "pre_img"
sticker_path = "smile.png"

process_images(folder_path, output_folder, sticker_path)
thehunss87

Recent Posts

공부 필수 어플 추천 ‘채점이’

요즘은 공부 효율을 높이기 위해 AI의 도움은 필수 입니다. 여러 AI 관련 어플들이 있는데 그중에서…

3주 ago

4대그룹 평균연봉 (24년 4대그룹 계열사별 평균 연봉, 직원수)

순위회사명인당급여직원수(명)1SK스퀘어2.79억원882LG1.87억원1823SK텔레콤1.62억원5,4934삼성증권1.57억원2,5655삼성카드1.50억원2,0216삼성화재해상보험1.49억원5,5497삼성생명1.48억원5,1638기아1.36억원35,7479현대모비스1.35억원12,31010삼성에스디에스1.34억원11,38711삼성물산1.34억원9,38012삼성전자1.30억원129,48013삼성E&A1.29억원5,85414SKC1.28억원17815SK아이이테크놀로지1.28억원38916제일기획1.28억원1,47417현대위아1.26억원2,93718현대자동차1.24억원75,13719현대로템1.20억원4,18220SK이노베이션1.19억원2,14821SK가스1.19억원66122LG에너지솔루션1.18억원12,63523SK하이닉스1.18억원32,39024현대차증권1.17억원89825LG전자1.17억원35,72726SK1.17억원4,40427LG씨엔에스1.16억원6,89128SK증권1.14억원84229SK디앤디1.12억원18030LG유플러스1.10억원10,57131현대건설1.09억원7,14732SK디스커버리1.09억원7233삼성바이오로직스1.07억원5,01134현대오토에버1.04억원5,42135삼성전기1.03억원12,16136LG화학1.03억원13,85737현대글로비스1.00억원2,44138삼성SDI0.97억원13,34139삼성중공업0.94억원10,11240현대제철0.93억원11,80341HS애드0.86억원79642SK케미칼0.85억원2,93243LG디스플레이0.83억원25,14444LG헬로비전0.82억원1,07545에스원0.81억원6,95846LG생활건강0.81억원4,38147SK바이오사이언스0.80억원1,02148LG이노텍0.80억원12,65849현대비앤지스틸0.76억원48650SK시그넷0.68억원35351SK오션플랜트0.62억원66452SK네트웍스0.60억원1,55453SK이터닉스0.39억원3084대그룹 평균1.19억원556,559 [참고사항] 인당 급여 : 24년 dart 사업보고서에 사업부문별, 성별로 1인당 급여액이 공시되어 있는데…

1년 ago

현대차그룹 계열사별 직원 평균급여 순위 (24년)

순위회사명인당급여직원수(명)1기아1.36억원35,7472현대모비스1.35억원12,3103현대위아1.26억원2,9374현대자동차1.24억원75,1375현대로템1.20억원4,1826현대차증권1.17억원8987현대건설1.09억원7,1478현대오토에버1.04억원5,4219현대글로비스1.00억원2,44110이노션1.00억원94611현대제철0.93억원11,80312현대비앤지스틸0.76억원486현대차그룹 평균1.23억원159,455 [참고사항] 인당 급여 : 24년 dart 사업보고서에 사업부문별, 성별로 1인당 급여액이 공시되어 있는데…

1년 ago

SK그룹 계열사별 직원 평균급여 순위 (24년)

순위회사명인당급여직원수(명)1SK스퀘어2.79억원882SK텔레콤1.62억원5,4933SKC1.28억원1784SK아이이테크놀로지1.28억원3895SK이노베이션1.19억원2,1486SK가스1.19억원6617SK하이닉스1.18억원32,3908SK1.17억원4,4049SK증권1.14억원84210SK디앤디1.12억원18011SK디스커버리1.09억원7212SK케미칼0.85억원2,93213SK바이오사이언스0.80억원1,02114SK시그넷0.68억원35315SK오션플랜트0.62억원66416SK네트웍스0.60억원1,55417SK이터닉스0.39억원308SK그룹 평균1.17억원53,677 [참고사항] 인당 급여 : 24년 dart 사업보고서에 사업부문별, 성별로 1인당 급여액이 공시되어 있는데…

1년 ago

LG그룹 계열사별 직원 평균급여 순위 (24년)

순위회사명인당급여직원수(명)1LG1.87억원1822LG에너지솔루션1.18억원12,6353LG전자1.17억원35,7274LG씨엔에스1.16억원6,8915LG유플러스1.10억원10,5716LG화학1.03억원13,8577HS애드0.86억원7968LG디스플레이0.83억원25,1449LG헬로비전0.82억원1,07510LG생활건강0.81억원4,38111LG이노텍0.80억원12,658LG그룹 평균1.02억원123,917 [참고사항] 인당 급여 : 24년 dart 사업보고서에 사업부문별, 성별로 1인당 급여액이 공시되어 있는데…

1년 ago

삼성그룹 계열사별 직원 평균급여 순위 (24년)

순위회사명인당급여직원수(명)1삼성증권1.57억원2,5652삼성카드1.50억원2,0213삼성화재해상보험1.49억원5,5494삼성생명1.48억원5,1635삼성에스디에스1.34억원11,3876삼성물산1.34억원9,3807삼성전자1.30억원129,4808삼성E&A1.29억원5,8549삼성바이오로직스1.07억원5,01110삼성전기1.03억원12,16111삼성SDI0.97억원13,34112삼성중공업0.94억원10,11213호텔신라0.56억원1,97214레인보우로보틱스0.48억원98삼성그룹 평균1.25억원214,094 [참고사항] 인당 급여 : 24년 dart 사업보고서에 사업부문별, 성별로 1인당 급여액이 공시되어 있는데…

1년 ago