Program/OPEN_CV

[Open CV] 기본적인 영상처리 기법 _ 히스토그램 역투영

사막여유 2022. 5. 13. 07:59
728x90

 

 

저번 강의에서도 InRange 함수를 사용하여 원하는 색상값을 추출할 수 있었는데 

히스토그램 역투영은 어떤 색상의 히스토그램 분포를 사용하여 해당 히스토그램 분포에 부합하는 픽셀을 

선별하는 방법이다.

 

이는 원색이 아닌 임의의 색상을 추출 ( 선별 ) 하고자 할때 좀 더 효과적으로 사용할 수 있다. 

예를들면 영상에 살색 또는 살구색등의 색상들을 HSV 에서 추출하면 H의 애매한 영역에서 추출해야하는데히스토그램 역투영 방법을 사용하면 해당 영상에 분포해있는 살색 부분 또는 살구색 부분을 추출할 수 있다.

 

 

위 영상에서 파란색 박스에 해당하는 색만 추출해내고싶다고 한다면 

아래와같이 해당 ROI 내부색상과 가장 부합하는 색상만 추출되는 것을 볼 수 있다.

 

 

 

 

cv2.selectROI 함수를 사용하여 위와같은 파란색 사각박스를 마우스로 그리게되면 x ,y ,w, h 의 값이 반환되게 된다.

 

그리고 위와같이 히스토그램을 먼저 계산해줘야한다.

BGR영상을 ycrcb의 영상으로 변환해 준 뒤

channel을 나눠주는데 y 성분의 0번채널은 사용하지 않는다. y 성분은 컬러성분이라기보다는

GrayScale의 밝기 정보이기 때문에 색상 추출을 위해서는 사용되지 않는 성분이다.

 

cr_bins , cb_bins 는 256의 값을 128로 단순화 시켜주는 작업을 해준 뒤 ( 256을 그대로 사용해도 무방하다 )그리고 cr,cb_range 를 0 ~255로 잡아주는 작업을 해준다. ( 256으로 사용해야지만 255까지의 값을 사용할 수 있다. ) 

 

 

이후 clacHist 함수를 사용하여 historgram을 계산한 뒤 

normalize 함수를 사용하여 hist 영상을 0 에서 255의 값을 갖는 GrayScale의 영상으로 변환시켜준 뒤

calcBackProject 함수를 사용하여 실제로 역투영 하는 방식을 취했다.

 

해당 함수들을 저번 강의에서 작성한 블로그글을 캡쳐했다.

 * 히스토그램 구하기 ( cv2.calcHist (images, channels, mask, histSieze, ranges, hist, accumulate )

// images -> 영상 한장 또는 여러장의 히스토그램을 구할 수 있다.

// chnnels -> 히스토그램을 구할 채널을 나타내는 리스트 

// mask -> mask 영역에서만 히스토그램을 구하고 싶을때 ( 255 값 ) , 없으면 None 

// histSize -> 히스토그램 각 차원의 크기 ( bin의 개수 ) 를 나타내는 리스트

// ranges -> 히스토그램 각 차원의 최솟값과 최대값으로 구성된 리스트 

// 이의 출력값은 numpy.ndarray 로 출력 된다.

 

 * 히스토그램 역투영 함수 ( cv2.calcBackProject ( images, channles, hist, ranges, scale, dst ) 

// images : 입력 영상 리스트

// channels : 역투영 계산에 사용할 채널 번호 리스트

// hist : 입력 히스토그램 

// ranges : 히스토그램 각 차원의 최솟값과 최댓값으로 구성된 리스트

// scale : 출력 역투영 행렬에 추가적으로 곱할 값

// dst : 출력 역투영 영상. 입력영상과 동일 크기

 

그래서 정리해보자면

 1. 기준 영상으로부터 구하고자하는 색상에 대한 컬러 히스토그램을 미리 계산

 ( 영상에서 살구색 부분만을 포토샵같은 툴을 사용하여 Mask 영상을 만듦 ) 

 2. 입력 영상에서 미리 구한 컬러 히스토그램에 부합하는 픽셀을 선별

 

 

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

https://bit.ly/3L3avNW

 

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

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

fastcampus.co.kr

 

728x90