기본 임계처리
cv2.threshold(src, thresh, maxval, type) → retval, dst
_, thresh1 = cv2.threshold(img,127,255, cv2.THRESH_BINARY)
- src – input image로 single-channel 이미지.(grayscale 이미지)
- thresh – 임계값
- maxval – 임계값을 넘었을 때 적용할 value
- type – thresholding type
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
- (참고) 여러 이미지를 하나의 화면에 보여줄때
plt.subplot()
함수를 사용합니다.
for i in xrange(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
적응 임계처리
이전에는 임계값을 이미지 전체에 적용하여 처리하기 때문에 하나의 이미지에 음영이 다르면 일부 영역이 모두 흰색 또는 검정색으로 보여지게 됩니다.
이런 문제를 해결하기 위해서 이미지의 작은 영역별로 thresholding을 하는 것입니다. 이때 사용하는 함수가 cv2.adaptiveThreshold()
입니다.
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
- src – grayscale image
- maxValue – 임계값
- adaptiveMethod – thresholding value를 결정하는 계산 방법
- cv2.ADAPTIVE_THRESH_MEAN_C : X, Y를 중심으로 block Size * block Size 안에 있는 픽셀 값의 평균에서 C를 뺸 값을 문턱값으로 함
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C : X, Y를 중심으로 block Size * block Size 안에 있는 Gaussian 윈도우 기반 가중치들의 합에서 C를 뺀 값을 문턱값으로 한다.
- thresholdType – threshold type
- blockSize – thresholding을 적용할 영역 사이즈
- C – 평균이나 가중평균에서 차감할 값
Otsu의 이진화
임계값을 어떻게 정의해야 할까요? 가장 일반적인 방법은 trial and error방식으로 결정했습니다. 그러나 bimodal image (히스토그램으로 분석하면 2개의 peak가 있는 이미지)의 경우는 히스토그램에서 임계값을 어느정도 정확히 계산 할 수 있습니다. Otsu의 이진화(Otsu’s Binarization)란 bimodal image에서 임계값을 자동으로 계산해주는 것을 말합니다.
적용 방법은 cv2.threshold()
함수의 flag에 추가로 cv2.THRESH_STSU
를 적용하면 됩니다. 이때 임계값은 0으로 전달하면 됩니다.
_, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
'Python > Image vision' 카테고리의 다른 글
Image Contours (0) | 2020.01.20 |
---|---|
Image Smoothing (0) | 2020.01.20 |
이미지 Processing (0) | 2020.01.20 |
도형 그리기 (0) | 2020.01.20 |
이미지 다루기 (0) | 2020.01.20 |