### Gray와 Binary 이미지
- Gray 이미지 : 0~255의 픽셀로만 구성된 흑백 이미지
- binary(이진) 이미지 : 0(검정), 255(흰색)으로만 구성된 이미지
#### Gray 이미지 만들기
##### 이미지를 읽어올 때 'cv2.IMREAD_GRAYSCALE'를 이용해 흑백으로 불러오기
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('./meet.jpg', cv2.IMREAD_GRAYSCALE)
plt.xticks([])
plt.yticks([])
plt.imshow(img, cmap='gray')
##### 컬러 이미지로 읽은 후 gray 이미지로 변환하기
img = cv2.imread('./meet.jpg', cv2.IMREAD_COLOR)
grayimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.xticks([])
plt.yticks([])
plt.imshow(grayimg, cmap='gray')
#### 이진(Binary) 이미지 만들기
img = cv2.imread('./meet.jpg', cv2.IMREAD_GRAYSCALE)
# threshold(이미지, 기준값, 기준보다 클 때 적용될 값, 적용방법)
_, thr = cv2.threshold(img, 125, 255, cv2.THRESH_BINARY)
plt.xticks([])
plt.yticks([])
plt.imshow(thr, cmap='gray')
# 기준값에 대한 정보
_
#### 임계값 결정하기
- 이진 이미지의 중요한 결정 요소 : 임계값 설정(기준값)
##### 1. OTSU 알고리즘
- 임계값을 임의로 설정 후 픽셀을 두 부류로 나눔
- 두 분류(흑, 백) 명암 분포를 구하는 작업 반복
- 명암 분포가 가장 균일할 때의 임계값 선택!
# 이미지 띄우기(흑백)
img = cv2.imread('./blackImg.jpg', cv2.IMREAD_GRAYSCALE)
_, thr1 = cv2.threshold(img, 125, 255, cv2.THRESH_BINARY)
plt.subplot(1, 2, 1)
plt.xticks([])
plt.yticks([])
plt.imshow(thr1, cmap='gray')
plt.show()
t, thr2 = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
plt.subplot(1, 2, 2)
plt.xticks([])
plt.yticks([])
plt.imshow(thr2, cmap='gray')
plt.show()
t
# 스도쿠 이미지 띄우기
img = cv2.imread('./sdoqu.png', cv2.IMREAD_GRAYSCALE)
# 이진화 진행(otsu 알고리즘 적용)
t, thr = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
plt.xticks([])
plt.yticks([])
plt.title(f"otsu : {t}")
plt.imshow(thr, cmap='gray')
# 스도쿠 이미지는 빛의 강도가 다르다!
##### 적응형 thresholding
- 이미지를 여러 영역으로 나누고 해당 영역의 픽셀값만 활용하여 임계값을 찾아냄
- 그 후 각 영역별로 이진화 진행
img = cv2.imread('./sdoqu.png', cv2.IMREAD_GRAYSCALE)
plt.subplot(2, 2, 1)
plt.xticks([])
plt.yticks([])
plt.imshow(img, cmap='gray')
t, thr2 = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
plt.subplot(2, 2, 2)
plt.xticks([])
plt.yticks([])
plt.title(f"otsu : {t}")
plt.imshow(thr2, cmap='gray')
# 적응형 thresholding
# (이미지, 적용시킬 값, 임계값 결정 방법,
# 이진화 방법, 영역을 설정할 블록 크기, 차감 상수)
thr3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY, 9, 5)
thr4 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 9, 5)
plt.subplot(2, 2, 3)
plt.xticks([])
plt.yticks([])
plt.title ("ADAPTIVE_THRESH_MEAN_C")
plt.imshow(thr3, cmap='gray')
plt.subplot(2, 2, 4)
plt.xticks([])
plt.yticks([])
plt.title ("ADAPTIVE_THRESH_GAUSSIAN_C")
plt.imshow(thr4, cmap='gray')
댓글