본문 바로가기
Python

[Python][Pycharm] 이미지 모자이크 처리

by teamnova 2021. 9. 13.
728x90

안녕하세요~

 

오늘은 OpenCV 모듈을 활용해서 이미지를 모자이크하는 기능을 만들어 보겠습니다.

 

개발 준비물

1. Python

2. Opencv

3. sample image

 

샘플 이미지 같은 경우 자신이 테스트하고자 하는 이미지를 사용하면 되겠습니다.

 

 

 

1. 프로젝트 생성

mosaic 프로젝트 생성

- 새로운 프로젝트 생성하기를 누르신 다음 프로젝트 명을 정해주시고 생성 버튼을 눌러줍니다.

 

 

 

2. OpenCV 모듈 추가 및 모자이크 기능 구현

이제 OpenCV를 추가해주고 모자이크 기능을 구현해볼건데요 이 부분은 제가 미리 작성해둔 스틱코드를 이용하여 구현해 보도록 하겠습니다.

 

모자이크 소스

import cv2
def mosaic(src, ratio):
    """
    ### 모자이크 기능
    :param src: 이미지 소스
    :param ratio: 모자이크 비율
    :return: 모자이크가 처리된 이미지
    """
    small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
    mosaic_img = cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)
    return mosaic_img


def mosaic_area(src, x, y, width, height, ratio):
    """
    ### 부분 모자이크 기능
    :param src: 이미지 소스
    :param x: 가로축 모자이크 시작 범위
    :param y: 세로축 모자이크 시작 범위
    :param width: 모자이크 범위 넓이
    :param height: 모자이크 범위 폭
    :param ratio: 모자이크 비율
    :return: 부분 모자이크가 처리된 이미지
    """
    mosaic_area_img = src.copy()
    mosaic_area_img[y:y + height, x:x + width] = mosaic(mosaic_area_img[y:y + height, x:x + width], ratio)
    return mosaic_area_img


  def opencv_img_save(img, save_img_path, save_img_name):
    """
    ### 처리 이미지 저장 기능
    :param img: 저장할 이미지
    :param save_img_path: 이미지 저장 경로
    :param save_img_name: 저장할 이미지 명
    """
    cv2.imwrite(save_img_path + save_img_name, img)

다음은 스틱코드를 사용하여 불러온 모자이크 기능의 소스입니다.

 

 

import cv2

소스를 불러왔으면 import cv2 부분에 빨간 줄이 쳐져있을 거예요 opencv 모듈이 추가되지 않아서 인데요. Alt+Enter를 눌러서 Python OpenCV 모듈을 추가해줍니다.

 

 

 

3. 메인 코드 작성

이제 위에서 불러온 기능들을 사용해서 이미지를 모자이크 처리하는 로직을 짜보겠습니다.

메인 코드

우선 샘플 이미지의 경로와 처리된 이미지를 저장할 경로를 정해줍니다. 그리고 opencv 모듈로 읽은 샘플이미지 소스를 위에서 선언한 모자이크 기능을 불러서 모자이크 해줍니다. 파라미터 ratio 에 따라서 모자이크 비율을 선택 해줄수 있습니다. 마지막으로 위에서 선언한 처린된 이미지를 저장하는 기능을 사용합니다. 

 

 

 # 샘플 이미지 경로
    origin_image_path = 'C:/Users/TFX5470H/Downloads/face_sample.jpg'
    # 처리된 이미지 저장 경로
    save_image_path = 'C:/Users/TFX5470H/Desktop/mosaic/'

    # 샘플 이미지 opencv에서 읽기
    origin_image_src = cv2.imread(origin_image_path)

    # 0.01 비율로 모자이크된 이미지
    mosaic_001_img = mosaic(origin_image_src, ratio=0.01)
    opencv_img_save(mosaic_001_img, save_image_path, 'mosaic_001.jpg')

    # 0.05 비율로 모자이크된 이미지
    mosaic_005_img = mosaic(origin_image_src, ratio=0.05)
    opencv_img_save(mosaic_005_img, save_image_path, 'mosaic_005.jpg')

    # 0.01 비율로 특정 영역만 모자이크된 이미지
    mosaic_area_005_img = mosaic_area(origin_image_src, 600, 500, 1300, 1300, ratio=0.01)
    opencv_img_save(mosaic_area_005_img, save_image_path, 'mosaic_area_001.jpg')

메인 함수의 전체 코드입니다. 정상적으로 동작하는지 확인하기위해 각각 0.01 비율 모자이크, 0.05 비율 모자이크, 0.01비율로 특정 영역만 모자이크한 이미지를 만들어봤습니다.

 

 

 

 

4. 테스트

정상 저장 확인

 

 

 

모자이크 테스트 결과

왼쪽 위의 사진 부터 시계방향으로 각각 원본사진, 0.01비율 모자이크, 특정 영역 0.01비율 모자이크, 0.05비율 모자이크입니다. 정상적으로 동작하는것을 확인할 수 있었습니다.