5. 임계처리 (이진화)
임계처리는 한 픽셀에 대해 임계 값을 정해 놓고 판별을 진행 하기 때문에 사용 하려면 일단 이미지가 컬러라면 gray로 변경시켜야 합니다. gray로 변경되면 하나의 픽셀이 0에서 255까지의 값 중 하나를 갖게 되고 그 값이 설정한 임계 값을 넘는가 넘지 않는가에 따라 작업을 진행 합니다.
5.1 Global Threshold
Global Threshold는 0에서 255의 값을 2개의 영역으로 분할 하여 작업을 하기 때문에 너무 극단적인 결과가 나타날 수 있습니다.
cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
parameter
|
내용
|
src |
이미지 파일. single-channel (gray 이미지) |
thresh |
임계 값 |
maxval |
임계 값 이상인 경우 적용할 값. 임계 |
type |
cv2.THRESH_BINARY cv2.THRESH_BINARY_INV cv2.THRESH_TRUNC cv2.THRESH_TOZERO cv2.THRESH_TOZERO_INV |
dst |
결과 이미지 |
threshold() 함수는 픽셀 값이 thresh 값을 기준으로 큰가 작은가에 따라 픽셀의 값을 수정해서 보여주는 기능을 합니다.
아래 표를 보면 type에 따라 픽셀(x, y) 값이 thresh 보다 크면 maxval로 치환 하거나 0으로 치환 하거나 thresh로 치환 하거나 원래 값을 유지 하거나 하고 아니면 표에 있는 데로 값을 수정하게 됩니다.
type
|
src(x, y) > thresh
|
otherwise
|
cv2.THRESH_BINARY |
maxval
|
0
|
cv2.THRESH_BINARY_INV |
0
|
maxval
|
cv2.THRESH_TRUNC |
thresh
|
src(x, y)
|
cv2.THRESH_TOZERO |
src(x, y)
|
0
|
cv2.THRESH_TOZERO_INV |
0
|
src(x, y)
|
- 원본 이미지
import numpy as np import cv2
imgFile1 = 'C:/opencv/threshold01.png'
img1 = cv2.imread(imgFile1, cv2.IMREAD_GRAYSCALE)
ret1, addWeight1 = cv2.threshold(img1, 127, 255, cv2.THRESH_BINARY) ret2, addWeight2 = cv2.threshold(img1, 127, 255, cv2.THRESH_BINARY_INV) ret3, addWeight3 = cv2.threshold(img1, 127, 255, cv2.THRESH_TRUNC) ret4, addWeight4 = cv2.threshold(img1, 127, 255, cv2.THRESH_TOZERO) ret5, addWeight5 = cv2.threshold(img1, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow('THRESH_BINARY', addWeight1) cv2.imshow('THRESH_BINARY_INV', addWeight2) cv2.imshow('THRESH_TRUNC', addWeight3) cv2.imshow('THRESH_TOZERO', addWeight4) cv2.imshow('THRESH_TOZERO_INV', addWeight5)
cv2.waitKey(0) cv2.destroyAllWindows() |
- 상단 원본과 결과 모음 입니다.
하나의 값에 의하여 양분되는걸 볼 수 있습니다.
다른 예로 global threshold를 이미지에 사용해 보겠습니다.
하나의 하트를 배경이 다른 두 곳에서 사진을 찍고 THRESH_BINARY를 적용해 보았습니다.
- 장판 위 하트
- 회색 바탕 하트
thresh를 82로 하니 장판에 있는 하트는 윤곽선을 확인할 수 있지만 회색에 있는 하트는 이제 뭔가 보이려고 합니다.
- 장판 위 하트
- 회색 바탕 하트
이제 thresh 값이 180이 되었습니다. 장판에 있는 하트는 윤곽선을 찾으려면 좀 어려울 것 같은데 회색에 있던 하트는 선명하게 윤곽선을 구할 수 있습니다.
- 장판 위 하트
- 회색 바탕 하트
이처럼 물체의 경계가 어느 정도의 기준 값으로 확실히 구분이 되는 경우에 사용하면 그 물체만 뽑아 내는데 사용할 수 있습니다.
5.2 Adaptive Threshold
Global Threshold는 물체가 주위와 구분이 되는 경우에 사용이 가능하지만 경계가 애매한 경우에는 사용하기가 어렵습니다. 그래서 이미지를 작은 단위로 나누어 비교하는 방식으로 adaptiveThreshold를 사용면 좀더 세밀한 값을 도출 할 수 있습니다.
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) → dst
parameter
|
내용
|
src |
이미지 파일. single-channel (gray 이미지) |
maxValue |
임계 값 이상인 경우 적용할 값. 임계 |
adaptiveMethod |
적용할 thresholding algorithm ADAPTIVE_THRESH_MEAN_C ADAPTIVE_THRESH_GAUSSIAN_C |
thresholdType |
cv2.THRESH_BINARY cv2.THRESH_BINARY_INV cv2.THRESH_TRUNC cv2.THRESH_TOZERO cv2.THRESH_TOZERO_INV |
blockSize |
threshold 계산을 위한 주변 pixel size |
C |
평균 또는 가중 평균에서 차감할 값. |
dst |
결과 이미지 |
알고리즘
|
src(x, yO > T(x, y)
|
otherwise
|
ADAPTIVE_THRESH_MEAN_C |
maxValue
|
0
|
ADAPTIVE_THRESH_GAUSSIAN_C |
0
|
maxValue
|
어느덧 짐을 싸야 하는 시간이 되었군요. 잠시 예전 계약서를 보면서
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C
- cv2.ADAPTIVE_THRESH_MEAN_C
이렇게 상황에 적합한 함수를 사용하면 됩니다.
'Tensorflow > OpenCV' 카테고리의 다른 글
OpenCV 6. 히스토그램 (Python) (1) | 2020.10.03 |
---|---|
OpenCV 이미지 붙이기 (1) | 2019.04.08 |
OpenCV 4. 이미지 비트 연산 (Python) (0) | 2019.04.06 |
OpenCV 4. 이미지 연산 (Python) (0) | 2019.04.05 |
OpenCV 3. 비디오 입력 출력 (Python) (2) | 2019.04.04 |