[python] 사진에 카툰(cartoon) 효과주기, cv2.stylization 함수

코딩/python|2020. 9. 9. 10:01

opencv 패키지에는 사진을 카툰처럼, 만화처럼 바꿔주는 함수가 있습니다. 바로 cv2.stylization이란 함수입니다. 우선 이 함수를 이용해서 몇 개의 사진에 카툰 효과를 넣어보겠습니다. 

 

 

진짜 뭔가 그린 것 같은 이미지가 되었죠? ㅎㅎ 이 방향(cartoonization)을 연구하는 사람도 꽤 많은 것 같습니다. 물론 요즘은 딥러닝 기반의 알고리즘들이 쏟아져 나오고 있고요. 

 

이 연구의 매력은 영화를 한 순간에 만화 영화, 카툰 버전으로 만들 수 있다는 점입니다. 엄청나지 않나요?ㅋㅋ 몇 초만에 하나의 프레임을 카툰화시킬 수 있다는 것이 놀랍습니다. 사람이 한 컷 그리려면 적어도 몇 시간은 걸릴텐데 말이죠. 어쩌면 그림을 그리는 분들에게는 슬픈 소식일 수도 있겠습니다...ㅜ 

 

아무튼 이 놀라운 기능이 opencv 패키지에서는 하나의 함수로 구현되어 있습니다. 다음과 같이 사용하면 됩니다.

 

cartoon_image = cv2.stylization(color_image, sigma_s=150, sigma_r=0.25) 

 

이때 사용자가 조정가능한 두 개의 파라미터가 있습니다. 하나는 sigma_s라는 것이고, 다른 하나는 sigma_r이라는 것입니다. sigma_s는 이미지가 얼마나 스무스해질지를 결정해줍니다. 클수록 이미지가 더 스무스해집니다. 0에서 200까지의 값이 입력 가능합니다. sigma_r은 이미지가 스무스해지는 동안 엣지를 얼마만큼 보존시킬지를 결정해줍니다. 작을 수록 엣지가 많이 보존됩니다. 0에서 1까지 입력 가능합니다. 

 

그런데 체감상 sigma_s를 변화시켰을 때는 큰 차이를 못 느끼겠고, sigma_r을 변화시켰을 때는 상당한 차이가 느껴집니다. sigma_s를 100으로 고정시킨 상태에서 sigma_r를 0.1, 0.5, 0.9로 변화시킨 결과를 보여드리겠습니다. 

 

 

 

엣지를 많이 보존시켰을 때는 좀 더 잘생겨보이는 효과가 있는 것 같습니다(잘 생겼다고 말 안 했고, 잘 생겨보인다고 말했습니다ㅋㅋ). 엣지가 부각되어 그런 거 같습니다. 반면, 엣지를 많이 날렸을 때는 좀 뚱뚱해보이고 흐리멍텅해보이는 느낌이 있네요. 이래서 살을 빼야합니다....ㅋㅋ 

 

다음은 간단한 예제 코드이니 참고하시기 바랍니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
import cv2
 
img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
 
cartoon_img = cv2.stylization(img, sigma_s=100, sigma_r=0.9)  
 
cv2.imshow('original', img)
cv2.imshow('cartoon', cartoon_img)  
cv2.waitKey(0)  
cv2.destroyAllWindows() 
 
cv2.imwrite('cartoon_test.jpg', cartoon_img)
cs

 

 

<참고자료>

[1] www.c-sharpcorner.com/article/cartoon-effect-and-pencil-sketch-using-open-cv-in-python/, C#Corner, "Cartoon Effect And Pencil Sketch Using Open CV In Python"