파이썬 + opencv로 비 사실적인 렌더링을 시도했습니다.

소개



opencv의 라이브러리에 준비되어 있는 비사실적 렌더링(논포토 리리스틱 렌더링:이하 NPR)을 시험해 보았습니다.
NPR은 입력된 영상이나 영상에 대해 손으로 쓴 그림과 같은 비사실적 표현을 목표로 합니다. 아래에서 실제 변환 결과를 참고로 이미지하십시오.

이 사이트를 참고로 구현했습니다.
OpenCV Non-Photorealistic Rendering
Learn OpenCV

결과



먼저 NPR의 실행 결과를 올려 둡니다.
입력은 여기



NPR 변환 결과
※opencv의 NPR은 4종류 있습니다.

edgePreservingFilter





detailEnhance





pencilSketch





stylization





구현



아래는 파이썬 코드입니다.

NPR.py
import cv2
import argparse
from PIL import Image

def NPR(src):
    epf = cv2.edgePreservingFilter(src, flags=1, sigma_s=60, sigma_r=0.4)
    de = cv2.detailEnhance(src, sigma_s=10, sigma_r=0.15)
    pen_gray, pen_col = cv2.pencilSketch(src, sigma_s=60, sigma_r=0.1, shade_factor=0.03)
    style = cv2.stylization(src, sigma_s=60, sigma_r=0.07)
    return epf, de, pen_col, style

def webcam_or_pic2npr(out,is_webcam,pic):
    if is_webcam:
        cap = cv2.VideoCapture(0)

        while True:
            ret, frame = cap.read()
            e,d,p,s = NPR(frame)
            cv2.imshow('raw_input', frame)
            cv2.imshow('edgePreservingFilter',e)
            cv2.imshow('detailEnhance',d)
            cv2.imshow('pencilSketch',p)
            cv2.imshow('stylization',s)

            key = cv2.waitKey(1) & 0xFF
            if key == ord('q'):
                break
            elif key == ord('s'):
                cv2.imwrite(out,frame)
                cv2.imwrite(out,p)
        cap.release()
        cv2.destroyAllWindows()
    else:
        img = cv2.imread(pic, cv2.IMREAD_COLOR)
        e,d,p,s = NPR(img)
        cv2.imwrite(str(out)+'edgePreservingFilter.png',e)
        cv2.imwrite(str(out)+'detailEnhance.png',d)
        cv2.imwrite(str(out)+'pencilSketch.png',p)
        cv2.imwrite(str(out)+'stylization.png',s)

def main():
    parser = argparse.ArgumentParser(description='python+opencv_npr')
    parser.add_argument('--in_pic','-i',default='sample.png',help='input_picture_name')
    parser.add_argument('--out','-o',default='./',help='output_dir')
    parser.add_argument('--is_webcam',action='store_true',help='use webwebcam_or_pic2npr')
    args = parser.parse_args()
    webcam_or_pic2npr(args.out, args.is_webcam, args.in_pic)

if __name__ == "__main__":
    main()

실행 명령 (입력 = 이미지)


python NPR.py -i picture_name -o output_dir 

실행 명령 (입력 = 웹 카메라)


python NPR.py --is_webcam

소감



파이썬과 opencv로 쉽게 구현할 수 있습니다.
라이브러리 4 종류의 로직의 상세는 시간이 있으면 추가 기술합니다.
여러가지 시험해 주시면 화상이 선명하게 되거나 보케 하고 있는 것을 알 수 있을까 생각합니다.

요약



파이썬 + opencv에서 비 사실적인 렌더링 네 가지 유형을 시도했습니다.
꼭, 수중의 화상으로 시험해 주세요.
읽어 주셔서 감사합니다.
소스 코드의 부정 등, 지적 있으면 잘 부탁드립니다.
LGTM도 환영합니다!

좋은 웹페이지 즐겨찾기