6-14 OpenCV 이미지 노이즈 제거를 위한 GaussianBlur 기법
컬라 오브젝트 이미지를 hue 값 범위를 주어 HSV(hue, saturation, value) 즉 색상, 채도, 명도 처리를 하게 되면 오브젝트 부분이 흰색으로 처리되고 나머지는 검정색 배경으로 처리된다. 하지만 오브젝트 뿐만 아니라 주위 환경에서 비슷한 색상의 하지만 오브젝트는 아닌 수준의 물건 나부랭이들이 있거나 좀 먼 위치에 창을 통해 들어오는 빛의 산란을 포함하여 화면상에 작은 반점들을 비롯한 불필요한 노이즈를 동반하게 된다. 이러한 노이즈를 일거에 싹 제거하는 소위 말하자면 회로에서 말하는 LOW PASS FILTERING 작업을 영상에서 해보자.
OpenCV에서 사용하는 GaussianBlur 가 바로 그러한 영상 노이즈 제거와 동시에 영상을 부드럽고 매끈하게 만드는 작업을 한다. 이론적으로 복잡하게 설명하자면 한이 없으므로 직설적으로 요약해보자. 즉 GaussianBlur처리를 하게되면 영상 화면의 뚜렷한 부분들이 약에 취한 듯 몽롱해지며 모호한 화질을 보여주게 된다. 심하게 하면 오브젝트를 못 알아볼 정도로 뭉그러지는 느낌을 주게 된다.
지난번 올렸던 고양이 사진을 대상으로 직접 GaussianBlur 처리하여 numpy의 hstack() 명령을 사용해 기존 영상 옆에 blur 효과 처리된 영상을 함께 출력하여 비교해 보자.
한편 Canny edge 처리 기법에 의해 얻은 윤곽선 형태의 이미지를 대상으로 GaussianBlur 처리 결과를 관찰해 보고 LOW PASS FILTERING 이 과연 가능한지 가늠해 보자. Canny edge 처리기법은 GaussianBlur처리와 아울러 자율주행 RC카 영상 처리에 반드시 필요한 기법임을 지적해 둔다.
GaussianBlur 처리된 고양이 영상에서 고양이의 얼굴을 정확하게 식별하기 어려울 정도로 흐릿해져 있음을 볼 수 있으며 Canny edge 처리에 대한 GaussianBlur 처리 결과에서는 내용물을 나타내는 세부 선들이 모조리 사라지고 거이 윤곽만 남았음을 확인할 수 있다. 아우러 이 영상에서는 작은 반점들이 없지만 처리해 보면 아주 스무싱 작업이 진행되어 배경색이 되어 버린다.
코드 구조는 face_detect_01.py 구조를 거의 그대로 이용하도록 한다. OpenCV 코딩에서 특별히 주의할 점 중의 하나가 사진을 영상처리한다든지 또는 비데오 영상을 처리한다든지 할 때 마다 영상 데이터 입력 부분이 당연히 바뀌는데 적응하기가 쉽지 않다. 그대안 중의 하나가 Pi 카메로로 영상 입력을 받는 face_detect_01.py코드에서 영상을 사진으로 살짝 대체해버리는 것이다. 즉 Pi카메라 앞에 정지해 있는 사진 영상을 보여 주는 기법으로 영상 데이터 입력 부분을 수정하면서 수 없이 발생하는 에러를 미연에 방지할 수 있는 괜찮은 방법 정도로 이해 하자.
GaussianBlur 처리에 나오는 ksize (11,11)은 영상 데이터의 X축과 Y축 방향의 평균 값과 함께 계산되는 표준 편차를 의미하며 반드시 홀수(odd number) 로 써 주든지 아니면 (0,0) 이가능하다. 값이 클수록 영상이 더욱 흐릿해 지게 된다.
필자의 블로그에 파이선 코드와 고양이 사진 파일을 올려두었으니 다운받아서 실행해 보도록 하자.
영상 이미지 처리는 많이 어렵네요.ㅋ
그런데 고양이 이미지 사진이 너무 귀엽습니다.😊
사용하는 라이브러리 모듈이 import cv2 와 PiCamera에 한정해서 딱 하나 돌아가는 코드 하나 준비해서 그 내에서 왔다 갔다 헤메는 모습이 보이실 겁니다. 사실 따져 보면 명령어 몇개 싸움인데 실제 RC 카 만드는 것에 대비 해보니까 어렵다기 보다는 까다로운 부분이 있네요. HSV 처리까지는 거의 Template 화 되었으니까 이제 남은 것은이미지 GaussianBlur 처리해서 Contours (오브젝트 윤곽선) 추출해내는 작업 정도인데 contoursFind 부분이3일 동안 에러를 대 방출 세일하는지 증말 까다롭네요. 곧 잡히겠지요.