반응형

이진 영상

컬러 영상이나 명암 영상을 0(black) 또는 1(white)인 영상인 이진 영상(binary image)으로 변환할 필요가 있다.

CV에서 에지(edge)를 검출한 후 에지만 1로 표현하거나 물체를 검출한 후 물체는 1, 배경은 0으로 표시하는 등의 일에 이진 영상을 활용한다.

 

이진화(Binarization)

명암 영상을 이진화하려면 임곗값(thresholding) T보다 큰 화소는 1, 그렇지 않은 화소는 0으로 바꾸면 된다.

식은 아래와 같이 정의한다. 이때, f는 원래 명암 영상이고 b는 이진 영상이다. 

b(j, i) = {(1, f(j, i) >= T), (0, f(j, i) < T)}

이 식을 적용할 때 가장 중요한 일은 임곗값 T를 결정하는 것이다. 너무 낮거나 높게 설정하면 대부분의픽셀이 물체나 배경에 쏠리는 문제가 발생한다.

 

아래는 컬러 영상에서 R 채널을 분리해([2]) 명암 영상으로 간주해 히스토그램을 구한다.

코드를 해설하자면 calcHist 함수로 히스토그램을 구한다. 이 함수는 인수를 리스트로 줘야 하는데, 첫 번째와 두 번째 인수는 영상과 영상의 채널 번호다. 필자는 img에서 R 채널만 분리하므로 [img]와 R 채널에 해당하는 [2]를 인수로 주었으며, 세 번째 인수는 히스토그램을 구할 영역을 지정하는 마스크인데, None이므로 전체 영상에서 히스토그램을 구한다. 네 번째 인수는 히스토그램의 칸의 수를 지정한다. 명암 단계 L이 256이므로 [256]을 지정한다. 마지막 다섯 번째 인수는 세어볼 명암값의 범위를 지정한다.

이후 matplotlib 모듈의 plot 함수로 히스토그램 h의 그래프를 그린다. 실행 결과를 보면큰 계곡이 한 개가 종 모양을 띠고 있음을 확인할 수 있다.  이와 같이 일부분에 히스토그램이 집중된다는 것을 보아 낮은 명암(contrast) 대비의 영상이라는 것을 알 수 있으며 영상이 뚜렷하지 못하고 희미한 영상이라는 것이다.

import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread('star.jpeg')
cv.imshow('image', img)

h = cv.calcHist([img], [2], None, [256], [0, 256])
plt.plot(h, color = 'r', linewidth = 1)
plt.show()

cv.waitKey()
cv.destroyAllWindows()

 

다음 포스팅에는 이진화를 최적화 문제로 취급하는 오츄 알고리즘을 알아보도록 하겠다.