Program/OPEN_CV

[Open CV] 이진 영상 처리 _ 모폴로지 _ 지역 이진화

사막여유 2022. 6. 6. 22:13
728x90

 

불균일한 조명성분이 있는 영상에대한 조명 이진화 기법에 대한 설명이다.

저번 영상에서 쌀알들이 조명이 균일하지 않아 어떤 부분은 보이고 어떤부분은 보이지 않는 현상이 있었다.

 

 

위 이미지처럼

영상 하단 부분은 평균보다 어둡기때문에 쌀알이 잘 표현되지 않는 듯한 모습을 볼 수 있다.

그럼 이처럼 균일하지 않은 조명의 영향을 해결하기 위해서는

픽셀 주변에 작은 윈도우를 설정하여 지역 이진화를 수행해야한다.

 

고려해야할 상황으로는 

 - 윈도우의 크기는 ?

 - 윈도우 형태는? Uniform? Gaussain?
    부분 영상을 잘라냈을때 중앙을 가중치를 더 줄것인지 등에 대한 고려

 - 윈도우를 겹칠 것인가 ? Overlap? Non-Overlap?

 - 윈도우 안에 배경 또는 객체만 존재한다면 ?
    부분영상내부에 Background or Object 즉, 0 또는 255의 값만 있는 경우에 대한 고려

 

 

우리가 해볼 방법으로는 영상을 16등분한 뒤 각각을 Otsu 알고리즘으로 이진화하여

다시 이어 붙이는 방식으로 진행할 예정이다.

 

 

일단 bw 와 bh 로 이미지의 가로 세로 크기를 구한 뒤 4로 나눠주어

영상을 16등분해준다.

이후 for문을 사용하여 

src영상에서 y를 0부터 128 ( bh/4 ) 까지 x를 0부터 128 ( bw/4 ) 까지 자른다

 * src_ dst_는 src와 dst2의 픽셀값을 공유한다. 
   따라서 dst_를 변경할 경우에는 dst2도 픽셀값이 변경된다.

그리고 cv2.threshold 함수를 사용하여 src에서 자른 부분을 Otsu 방법을 사용하여 이진화한 뒤 dst_에 저장하도록 한다.

위와같은 방법을 총 16번 수행하여 영상의 전체를 16부분으로 쪼개 이진화 시키는 것이다.

 * 이 전 강의에서처럼 _, dst_ = cv2.threshold 의 형태를 사용하지 않은 이유는 dst_를 출력으로만 받기 때문에
    완전히 새로운 영상으로 만들게된다. 따라서 윗줄에서 만들었던 dst_의 정보를 잃어버리기때문에 뒤 인자로 주어
    입력이자 출력의 형태로 사용하도록 해야한다.

 * dst_의 크기는 src_와 크기가 같아야한다.

 

이와 다른 방법으로는 OpenCV 적응형 이진화 방법이 있다.

cv2.adaptiveThreshold ( src, maxValue, adaptiveMethod, thresholdType, bolckSize, C, dst ) 

 src : 입력영상 . 그레이스케일 영상

 maxvalue : 임계값 함수 최댓값. 보통 255

 adaptiveMethod : 블록 평균 계상 방법지정.
                              cv2.ADAPTIVE_THRESH_MEAN_C는 산술 평균
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C는 가우시안 가중치 평균

 thresholdType : cv2.THRESH_BINARY 또는 cv2.THRESH_BIANRY_INV 지정

 blockSize : 블록크기 . 3이상의 홀수

 C : 블록 내 평균값 또는 블록 내 가중 평균값에서 뺄 값

 

 

실제 Adaptive 를 사용하여 구현한 이미지인데 중간 중간 보이는 검은 점들은

block 내부에 배경또는 객체만 있는 경우 생기는 노이즈이다.

 * 위 방법은 전에 설명한 지역이진화 방법보다 연산이 느리다.

 

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

https://bit.ly/3L3avNW

 

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

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

fastcampus.co.kr

728x90