Program/OPEN_CV

[Open CV] 필터링 _ 실전 코딩 ( 카툰 필터 카메라 )

사막여유 2022. 5. 21. 21:54
728x90

2022.05.21 금일은 카툰 필터카메라 실전코딩에  관한 강의였다.

 

 

금일은 노트북에 있는 웹캠을 통해 입력되는 영상을 실시간으로 카툰 필터링을 적용하는 기능을

실제로 코딩해보는 시간이다.

 

총 3가지의 기능을 구현한다.

 - 카툰 필터

 - 스케치 필터

 - 스페이스바를 누를때마다 모드 변경

 

 - 카툰 필터

 입력 영상의 색상을 단순화시키고, 에지 부분을 검정색으로 강조하면 카툰처럼 변환이 된다.

이론상 이전에 배웠던 필터들을 사용하면 쉽게 구현할 수 있다.

 cv2.bilateralFilter() 함수를 사용하여 영상을 Blurring 하고

 cv2.Canny() 함수를 사용하여 영상의 Edge 부분을 따내 표현해준 뒤

 두 영상을 cv2.bitwise_and ( bit 단위 And 논리 연산 ) 처리하여 합쳐주면 카툰 필터를 구현할 수 있다. 

 * Canny 함수를 사용하게 되면 검은색이 평탄한 부분이고 엣지는 흰색의 형태로 출력되기때문에

   255에서 Canny 영상값을 빼주면 반전된 영상으로 사용할 수 있다. 

 * bitwise 연산을 하기 전 두 영상의 Type 이 맞는지를 확인해봐야 한다. 

 

 

 

하지만 위와같은 방법으로 실제로 코딩해보면 영상처리속도가 느리다는 것을 느낄 수 있다.

그래서 실제로 사용하기 위해서는 원본영상의 사이즈를 축소해서 Blurring 처리를 한 뒤 다시 확대해서

출력영상으로 내보내는 중간처리과정을 넣어주면 컬러 영상처리가 조금 더 단순화 되고 

처리속도가 증가하는 것을 볼 수 있다.

 

 

위 코드를 보면 h,w 의 shape을 받아와서 저장해준 뒤 그 값을 1/2의 값으로 나눠서 영상처리를 해준 뒤 

다시 resize 해서 원본 영상으로 크기를 맞춰준다.

 * interpolation = cv2.INTER_NEAREST 는 카툰 필터에 최척화하여 값이 급격히 바뀌는 느낌을 강조하기 위해 사용

 

 

 - 스케치 필터 

 입력 영상의 색상 GrayScale로 변환시키고 가우시안블러를 사용하여 영상을 블러처리준 뒤 

 divide() 함수를 사용하여 스케치필터를 구현할 수 있다. 

 평탄한 영역은 흰색, 에지근방에서는 어두운 영역을 검정색으로 설정해준다. 

 

 * divide 연산을 하게되면 엣지가 상승하는 부분에서 GaussianBlur가 적용된 부분에 대해서

   기존 엣지의 값과 가우시안블러가 적용된 값의 차가 있는 부분 ( 상승 부분만 해당 ) 만 검은색으로 출력되고

   나머지 부분은 흰색으로 처리된다.

   따라서 divide 된 영상에 255를 곱해주면 검은색으로 출력되는 부분은 상수값으로 0.xx의 값들이 출력되고

   이외의 부분에서는 255의 값으로 출력되는데 이를 결과로 보게되면 아래와 같은 결과를 볼 수 있다.

 

 

 

필터링 강의는 여기서 마치지만 평균값필터, 가우시안필터, 언샤프닝 필터등이 실제 머신비전에서

많이 사용되기 때문에 많이 알아놓으면 좋을 것 같다. 

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90