백인감자

영상 이진화 본문

OpenCV

영상 이진화

백인감자 2017. 7. 24. 16:29


왜 이진화를 하는가 ?


Gray-scale image는 한 픽셀당 8비트 밖에 차지하지 않기 때문에 컬러이미지보다 크기가 작아 처리하기 쉽다. Binary image의 경우, 픽셀이 가질 수 있는 색은 단 2가지, 흰색 혹은 검정색뿐이다. 따라서 한 픽셀당 1비트만 있어도 되기 때문에, Gray-scale image보다 연산 속도가 빠르다. 영상크기가 작을 때는 못느낄수도 있지만 영상의 크기가 커지거나 영상의 개수가 많으면 연산 속도 차이가 느껴질것이다.

--> 빠른 연산속도를 얻기 위해 사용할 수 있다.


출처: http://swprog.tistory.com/entry/사진을-흑백영상으로-바꾸기 [소프트웨어 개구리]




참고: http://docs.opencv.org/2.4.9/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours#cv2.findContours



threshold

http://opencv-python.readthedocs.io/en/latest/doc/09.imageThresholding/imageThresholding.html



http://swprog.tistory.com/entry/%EC%82%AC%EC%A7%84%EC%9D%84-%ED%9D%91%EB%B0%B1%EC%98%81%EC%83%81%EC%9C%BC%EB%A1%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0




cv2.threshold(srcthreshmaxvaltype) → retval, ds


Parameters:
  • src – input image로 single-channel 이미지.(grayscale 이미지)
  • thresh – 임계값
  • maxval – 임계값을 넘었을 때 적용할 value
  • type – thresholding type

위 코드에서 본다면 thresh 이상값은 maxval으로 처리 , 25 미만값은 검은색으로 처리.



임계치 설정


문제점은 위와 같은 형식이면 임계치를 절대값으로 설정을 하는 것이기 때문에 각기 다른 환경이면 임계치를 어떻게 설정할지에 대한 이슈가 발생한다.  그에 대한 해결책으로 Otsu's method (오츠, 오쓰) 가있다. ( https://en.wikipedia.org/wiki/Otsu's_method )

python 코드를 예로 들면 아래와 같은 형태로 작성할 수 있다.  임계값을 0 으로 설정하고 cv2.THRESH_OTSU 를 기존코드에 붙여 작성해주면 함수에서 임계치를 0~255 까지 반복하면서 계산해서 최적값을 찾은 후  적절한 임계치를 설정해준다.

cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)   


Otsu의 이진화 방법은 임계값 T를 기준으로 영상 픽셀들을 두 클래스로 분류했을 때 두 클래스간의 intra-class variance를 최소화하거나 또는 inter-class variance를 최대화하는 T를 찾는 이진화 방법이다. 원리는 다음과 같다.



입력 영상에서 임계값 T보다 어두운 픽셀들의 비율을 α, 밝기 평균을 μ1, 분산을 σ12, T보다 밝은 픽셀들의 비율을 β, 밝기 평균을 μ2, 분산을 σ22라 했을 때 (α+β=1), intra-class 분산과 inter-class 분산은 각각 다음과 같이 계산된다.



intra-class variance = ασ12+βσ22     --- (1)


inter-class variance = αβ(μ1-μ2)2     --- (2)



식 (1)을 최소화시키는 것은 식 (2)를 최대화시키는 것과 동일하며 둘 중 어느 기준을 사용해도 무방하지만 계산상으로는 식 (2)를 최대화시키는 것이 효율적이다. 즉, Otsu의 이진화 알고리즘은 임계값 T를 0 부터 255까지 단계적으로 변화시키면서 식 (2)를 계산하고 식 (2)가 최대가 되는 T 값을 찾아서 영상을 이진화하는 방법이다.



출처: http://darkpgmr.tistory.com/115 [다크 프로그래머]



이진화 수행 후 어떤 작업을 하는가?

이진화로 변환된 영상을 input 으로 받아서  영상의 윤곽선을 검출하는 함수를 적용하거나 영상에 있는 문자를 더 잘보이게 할 수 있다.





Comments