gray 이미지 : 0-255로 된 픽섹로만 구성된 흑백이미지
binary(이진) 이미지 : 0(검정색)과 255(흰색)으로만 구성된 이미지 (마스크 패턴, 필터링)
Gray -> 회색
픽셀값을 0~255의 범위로 표현하는 방식
픽셀 채널이 1인 경우 흑백
픽셀 채널이 3인 경우 컬러
픽셀 채널이 1인 경우
0 -> 검은색
255 -> 흰색
127 -> 회색
Binar -> 이진(2개)
픽셀값을 0과 255의 범위로 표현하는 방식
img = cv2.imread(파일명, cv2.IMREAD_GRAYSCALE)
img_gray = cv2.cvtColor(이미지객체, cv2.COLOR_BGR2GRAY)
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('images/lenna.png', cv2.IMREAD_GRAYSCALE)
# interpolation = 보건법 설정
# 보건법 : 이미지 픽셀이 비어있는 곳을 채워주는 방법
plt.imshow(img, cmap ='gray', interpolation='bicubic')
plt.xticks([])
plt.yticks([])
plt.title('model')
plt.show()
# 실습
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('images/lenna.png', cv2.IMREAD_COLOR)
# BGR 컬러 이미지를 gray 이미지로 변환
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray_img, cmap='gray')
plt.yticks([])
plt.xticks([])
plt.show()
img : Grayscale 이미지
threshold_value : 픽셀 문턱값 (경계를 기준으로 0과 1로 나누기 위한 기준값)
value : 문턱값보다 클 때 적용되는 값
flag : 문턱값 적용 방법
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('images/lenna.png', cv2.IMREAD_GRAYSCALE)
# _ : 첫번째 반환 값을 쓰지 않겠다 선언.
# thr : 쓰래스 홀드 의 약자
plt.figure(figsize=(8,8))
#######################################################
plt.subplot(2, 2, 1)
_, thr1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
plt.imshow(thr1, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title('THRESH_BINARY_INV')
#######################################################
plt.subplot(2,2,2)
_, thr1 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
plt.imshow(thr1, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title('THRESH_BINARY_INV')
#######################################################
plt.subplot(2,2,3)
_, thr1 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO )
plt.imshow(thr1, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title('THRESH_BINARY_INV')
#######################################################
plt.subplot(2,2,4)
_, thr1 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
plt.imshow(thr1, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title('THRESH_BINARY_INV')
# 실습
# flag 값에 따른 출력 비교
plt.figure(figsize=(8,8))
plt.subplot(2, 2, 1)
_, thr1 = cv2.threshold(img, 100, 255, cv2.THRESH_TOZERO )
plt.imshow(thr1, cmap='jet')
plt.xticks([])
plt.yticks([])
plt.title('jet')
plt.subplot(2, 2, 2)
_, thr1 = cv2.threshold(img, 100, 255, cv2.THRESH_TOZERO )
plt.imshow(thr1, cmap='spring')
plt.xticks([])
plt.yticks([])
plt.title('spring')
plt.show()
# 실습
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('images/news_paper.jpg', cv2.IMREAD_GRAYSCALE)
# 우리가 경계값을 설정해줘 보자!
_, thr1 = cv2.threshold(img, 125, 255, cv2.THRESH_BINARY)
plt.imshow(thr1, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title('binary')
plt.show()
# 오츠 알고리즘을 이용해서 경계값을 찾아보자 !
t, thr2 = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
plt.imshow(thr2, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title(f'otsu{t}')
plt.show()
# 실습
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('images/sudoku.png', cv2.IMREAD_GRAYSCALE)
# 일반 이진화
_, thr1 = cv2.threshold(img, 123, 255 ,cv2.THRESH_BINARY)
# 오프 알고리즘
_, thr2 = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 적응형 Threshold
blk_size = 9 # 블럭의 사이즈
C = 5 # 임계값의 차감 상수
thr3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY , blk_size, C)
thr4 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY , blk_size, C)
# 이진화된 이미지 출력
plt.figure(figsize=(8,8))
plt.subplot(2,2,1)
plt.imshow(thr1, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title('binary')
#############################################
# 오즈 알고리즘 이미지 출력
plt.subplot(2,2,2)
plt.imshow(thr2, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title(f'otsu:{t}')
#############################################
# 이진화된 이미지 출력
plt.subplot(2,2,3)
plt.imshow(thr3, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title('AD_TH_MEAN_C')
#############################################
# 가우시안 이미지 출력
plt.subplot(2,2,4)
plt.imshow(thr4, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.title('AD_TH_GAU_C')
○ 칼라이미지를 gray 이미지로 변환하는 방법
○ gray 이미지를 binary로 변환하는 방법