앞서 배운 2차원 히스토그램과 HSV 컬러 스페이스를 이용하면 색상으로 특정 물체나 사물의 일부분을 배경에서 분리할 수 있다.
기본 원리는 물체가 있는 관심영역과 H와 V 값의 분포를 얻어낸 후 전체 영상에서 해당 분포의 픽셀만 찾아내는 것
* 해당 포스팅에서 다루고 있는 모든 내용은 다음 서적을 참고하였습니다.
파이썬으로 만드는 OpenCV 프로젝트
“개발자에게 딱 필요한 만큼의 이론과 활용 가능한프로젝트로 배우는 OPENCV 프로그래밍”OPENCV는 영상 처리와 컴퓨터 비전 분야에서 현존하는 가장 영향력 있는 라이브러리이다.이 책은 누구나
내용 정리
1. 역투영
0) 정의
-> 히스토그램 역투영은 영상의 각 픽셀이 주어진 히스토그램 모델에 얼마나 일치하는지를 검사하는 방법으로, 임의의 색상 영역을
검출할 때 효과적이다. 역투영을 이용하면 알파 채널이나 크로마 키 같은 보조 역할 없이도 복잡한 모양의 사물을 분리할 수 있지만,
대상 사물의 색상과 비슷한 색상이 뒤섞여 있을 때는 효과가 떨어지는 단점도 있음
* 역투영은 전체 영상의 색상 정보와 대상 객체의 색상 정보의 비율을 0~255 구간으로 노멀라이즈 한 것으로 볼 수 있다.
역투영 결과 값은 추적 대상 객체의 색상 값과 비슷한 영역의 픽셀들만 큰 값을 가짐
1) 역투영 함수
-> cv2.calcBackProject(img, channel, hist, ranges, scale)
· img: 입력 영상, [img]처럼 리스트로 감싸서 표현
· channel: 처리할 채널로, 리스트로 감싸서 표현한다. (1채널: [0], 2채널: [0, 1], 3채널: [0, 1, 2])
· hist: 역투영에 사용할 히스토그램
· ranges: 각 픽셀이 가질 수 있는 값의 범위
· scale: 결과에 적용할 배율 계수
2) 활용
선택한 관심 영역을 HSV 컬러 스페이스로 변경하고, H와 S채널에 대한 2차원 히스토그램을 계산한 결과를 역투영 함수에 인자로 전달
* masking() 함수: 스레시홀드와 마스킹을 거쳐 결과를 출력
cv2.getStructuringElement(), cv2.filter2D() 함수: 마스크의 표면을 부드럽게 함
다음은 역투영을 수행한 결과물이다.
역투영의 경우 사물의 색상과 비슷한 생상이 뒤섞여 있을 때 효과가 떨어진다고 하였는데, 다음은 효과가 떨어지는 역투영 영상이다.