rueki
Opencv tutorial(python) 이미지 Thresholding 본문
이미지처리에서 edge와 그에 대한 shape이 중요할 때가 있는데, 이런 경우에 gray scale로의 변환이 매우 중요하다.
예를들어 검은색 이미지에 흰색 선으로 이루어진 물체가 있으면, 물체에 대해 쉽게 분별이 될 것이다.
threshold는 임계의 의미로써, 쉽게 받아들이면, 그냥 임계값으로 생각하면 될 것 같다.
이미지에서 thresholding 작업을 함에따라 하얀색 or 검은색, 이 두가지 value만 갖게 될 것이다.
먼저 필요한 라이브러리를 호출하자.
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
img = cv2.imread('파일 경로', 0) #0으로 설정함에 따라 gray scale로의 변환
plt.imshow(img, cmap='gray') #사진 출력은 회색 계열로 될 것임
여기서는 임계값을 127로 잡을 것인데, 픽셀 값이 0~255이니 255/2를 한 값으로 정했다.
cv2.threshold라는 함수를 사용할 것인데, 파라메터로는 source(사용할 이미지), threshold, max value, 설정값이 있는데
코드를 통해 추가 설명을 하려고 한다.
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
THRESH_BINARY를 사용하면 값이 0 아니면 1을 갖게 되고. 즉 black or white 값을 갖는다.
여기에 inv를 붙이면 1과 0의 값을 갖게 된다.
그리고 threshold trunc가 적용이 되는데, 임계값보다 높으면 임계값의 값을 갖게되고 낮으면 0으로 출력된다.
만약 픽셀값이 128이면, 우리가 설정한 임계값 127로 되고 127보다 낮은 값, 예로 120이면 0으로 나오게 된다.
이러면 사진의 픽셀은 0 아니면 127이 유지가 될 것이다. 이 값을 이제 앞에서 설명한, BINARY화를 시키게 되면, 0과 1의 값을 갖게 되는 것을 확인할 수가 있다.
ret 변수는 127 값을 반환하고, thresh1은 이미지 데이터라고 생각하면 될 것이다.
#임계값보다 높으면 1 낮으면 0
plt.imshow(thresh1,cmap='gray')
개념을 이제 알아보았으니 새로운 사진으로 한번 다시 해보자.
img = cv2.imread('파일경로',0)
plt.imshow(img, cmap='gray')
사진이 작으니 확대하는 함수를 생성해서 출력해보자.
def show_pic(img):
#그래프 크기를 15 x 15로 설정
fig = plt.figure(figsize=(15,15))
ax = fig.subplot(111)
ax.imshow(img,cmap='gray)
show_pic(img)
위의 예제에서 적용했던 임계값 그대로 사용을 해보자.
ret, th1 = cv2.threshold(img, 127,255,cv2.THRESH_BINARY)
show_pic(th1)
추가적으로, adaptiveThreshold에 대해 알아보자.
앞의 threshold에서는 이미지의 일부 영역에서 음영이 다르면 0과 1로 극명하게 갈려, 흰색 아니면 검은색으로 된다는 것이다.
이를 해결하고자, 범위를 줄여서, 임계처리를 진행하는 adaptiveThreshold를 사용하고자 한다.
파라메터로는 아래와 같다.
임계값을 구하는 method로는 아래와 같이 2가지가 있다.
- cv2.ADAPTIVE_THRESH_MEAN_C : 주변영역의 평균값으로 결정
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C
th2 = cv2.adaptiveThreshold(img,255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 8)
show_pic(th2)
'python' 카테고리의 다른 글
OpenCV로 두 가지 영상 합성해서 이어붙이기 (0) | 2020.12.02 |
---|---|
Opencv tutorial(python) Template matching (0) | 2020.07.01 |
Opencv tutorial(python) 1. 이미지 읽기, 컬러 채널 변경하기 (3) | 2020.06.24 |
Numpy - BroadCasting (0) | 2020.06.01 |
행렬 및 리스트 값 0으로 바꿀 때의 방법 비교하기 (0) | 2020.05.26 |