이번 포스팅은 책 '파이썬으로 만드는 OpenCV 프로젝트'를 보고 공부한 내용을 바탕으로 만들었습니다.
혹시나 틀린 부분이나 수정해야 할 부분이 있다면 댓글 남겨주세요!
영상 처리는 새로운 영상을 얻기 위해 기존 영상의 픽셀 값에 연산을 하여 새로운 픽셀 값을 얻는 작업입니다.
이 책에서 기존 픽셀 값과 주변 픽셀들의 값을 활용하여 얻는 방법인 공간 영역 필터를 사용하여 픽셀 값을 얻는 방법을 알려줍니다.
컨볼루션(convolution)
- 컨볼루션 연산은 커널(kernel)을 만들어 각 요소와 상응하는 입력 픽셀 값을 곱하여 모두 합한 것을 결과 값으로 결정하고 이것을 마지막 픽셀까지 반복하는 것을 말합니다.
- 그림으로 얘기한다면
(0x4)+(0x0)+(0x0)+(0x0)+(1x0)+(1x0)+(0x0)+(1x0)+(2x-4)=-8로 구하는 방법이며 이것을 마지막까지 반복하여 연산합니다.
-OpenCV 에서 컨볼루션 함수를 담당하는
cv2.filter2D(src, ddepth, kernel)을 제공합니다.
ddepth : 출력 영상의 dtype이며 -1로 하여 입력영상과 동일하게 할 수 있습니다
(출처: https://developer.apple.com/documentation/accelerate/blurring_an_image)
블러링(Blurring)
- 영상을 흐릿하게 만드는 것을 블러링 또는 스무딩이라고 하며 적용하는 가장 쉬운 방법은 주변 픽셀 값들의 평균을 적용하여 컨볼루션 연산을 하는 것입니다. 평균값을 적용한다는 의미는 다른 픽셀과 비슷한 값을 가지게 하는 것으로 영상 전체적인 픽셀 값이 적어지게 되어 이미지가 흐릿하게 됩니다.
- output은 5x5 커널을 만들어 filter2D로 적용하는 방법을 하였고
output1은 OpneCV에서 제공하는 blur 함수를 이용하여 만들었습니다.
- blur에서 커널 크기는 홀수를 사용하는 것이 일반적입니다.
- 결과를 보면 레나의 이미지가 흐릿하게 된 것을 볼 수 있습니다.
가우시안 블러링
- 가우시안 분포를 가지는 커널로 블러링을 하는 것을 가우시안 블러링이라 합니다. 가우시안 분포를 사용한다면 픽셀 값을 선정할 때 대상 픽셀에 가까울수록 영향을 많이 주며 멀어질수록 적게 주게 되어 노이즈를 제거하는데 효과가 있습니다.
- OpenCV에서 함수를 제공하며 cv2.GaussianBlur(src, ksize, sigmaX)이며 kisze는 커널의 크기 홀수를 사용하며, sigmaX는 표준편차 값을 말하는데 0을 하면 자동으로 표준편차 값을 사용합니다.
미디언 블러링
- 커널 픽셀 값 중에 중간 값을 대상 픽셀의 값으로 선택하는 것을 미디언 블러링이라 합니다.
- 기존 픽셀 중 하나를 선택하므로 기존 값을 활용하는 필터입니다.
- OpenCV은 이것을 위해 cv2.medianBlur(src, ksize)를 제공합니다. ksize은 커널 크기를 말합니다.
바이레터럴 필터
- 블러링은 노이즈를 제거하는데 효과가 있지만 edge도 흐릿하게 만드는 문제를 가지고 있습니다.
- 바이레터럴 필터는 가우시안 필터와 경계 필터 2개를 사용하여 노이즈는 없고 edge가 비교적 괜찮은 결과를 얻을 수 있습니다.
- 속도가 느리다는 단점을 가지고 있습니다.
- OpenCV에서 cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)를 제공하며 d는 커널의 크기이며 5 이상이 되면 매우 느려집니다.
- sigmaColor와 sigmaSpac에 같은 값을 넣는 게 좋으며 범위는 10~150 정도를 권장합니다.
이와 같이 책에서 6강 영상 필터의 내용을 정리하는 시간을 가져봤고
OpenCV로 구현하여 결괏값을 도출해보았습니다.
틀린 부분이나 질문이 있으신 경우 댓글을 남겨주세요!
'영상처리' 카테고리의 다른 글
Python - OpenCV (6) : Image Inpainting (0) | 2021.07.09 |
---|---|
Python - OpenCV (5) : 허프 변환 (Hough Transformation) (0) | 2021.05.25 |
Python - OpenCV (4) : 컨투어(contour) 1 (0) | 2020.12.06 |
Python - OpenCV (3) : 모폴로지(morphology) (0) | 2020.12.05 |
Python - OpenCV (2) : 영상 필터 경계(edge) 검출 (0) | 2020.12.03 |