오늘은 OpenCV 를 통해 이미지를 이진화하는 방법을 익혔다.
Binarization, 즉 이진화는 그레이 스케일 이미지를 흰색과 검은색으로 구성된 바이너리 이미지로 바꾸는것 이다.
영상처리 알고리즘을 적용하기 전, 전처리 단계로 사용되며, 배경과 오브젝트를 구분하여 검출하는 데 대표적으로 사용된다.
앞으로의 OpenCV 예제에서 반드시 쓰여야 할 것 같아 보였다.
먼저, 컬러이미지를 읽어오고, 그 이미지는 RGV 세가지 채널로, 0 - 255 범위로 구성된다.
그다음 그레이스케일로 변환하며, 이것은 하나의 채널로, 0- 255 범위로 구성된다.
마지막으로 그레이스케일로 변환한 것을 이진화하는데, 0, 255 둘 중 하나만 가지게 된다. 즉, 흰색 혹은 검정색으로 바이너리 이미지로 바뀌게 된다.
import cv2
def nothing(x): # 트랙바 생성시 필요, 사용 x
pass
cv2.namedWindow('Binary') # 트랙바를 붙힐 윈도우를 설정
cv2.createTrackbar('threshold', 'Binary', 0, 255, nothing) # 1) 트랙바의 식별자
cv2.setTrackbarPos('threshold', 'Binary', 127) # 트랙바의 초기값 127로 설정
img_color = cv2.imread('ball.jpg', cv2.IMREAD_COLOR)
cv2.imshow('Color', img_color)
cv2.waitKey(0)
img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray', img_gray)
cv2.waitKey(0)
while(True): # 트랙바를 이동시 결과를 바로 확인할 수 있도록
low = cv2.getTrackbarPos('threshold', 'Binary') # 트랙바의 현재값을 가져와 임계값으로 사용할 수 있도록 함
#이진화
ret,img_binary = cv2.threshold(img_gray, low, 255, cv2.THRESH_BINARY_INV) # THRESH_BINARY_INV : 반전된 마스크 이미지
# 그레이스케일 이미지 이어야함, 두번째 값을 기준으로 결과 이미지의 픽셀이 흰색 혹은 검은색이 됨,
# threshold 보다 픽셀값이 클때, 세번째 파라미터로 픽셀값을 지정함, 작으면 0으로 지정
cv2.imshow('Binary', img_binary)
img_result = cv2.bitwise_and(img_color, img_color, mask = img_binary) # 원본이미지와 바이너리 이미지를 엔드연산하는 코드
cv2.imshow('Result', img_result)
if cv2.waitKey(1)&0xFF == 27: # esc 누르면 닫음
break
cv2.destroyAllWindows()
img_color = cv2.imread('ball.jpg', cv2.IMREAD_COLOR)
ball.jpg 이미지를 가져와 컬러이미지로 읽어들인다.
cv2.imshow('Color', img_color)
컬러이미지를 'Color' 라는 창에 띄워 보여준다.
동일한 방식으로 그레이스케일로 변환하여 진행한다.
img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray', img_gray)
while(True):
트랙바를 이동할 때, 결과이미지를 바로 확인할 수 있도록 루프를 돌린다.
cv2.namedWindow('Binary')
우선 바이너리 이미지를 나타내기 위한 창을 하나 만든다.
cv2.createTrackbar('threshold', 'Binary', 0, 255, nothing)
트랙바 이름, 트랙바가 생성될 윈도우 이름, 시작값, 끝값, 콜백함수
cv2.setTrackbarPos('threshold', 'Binary', 127)
트랙바 이름, 트랙바가 생성될 윈도우 이름, 트랙바의 초기값 (0-255 사이값)
low = cv2.getTrackbarPos('threshold', 'Binary')
트랙바 이름, 트랙바가 생성될 윈도우 이름
ret,img_binary = cv2.threshold(img_gray, low, 255, cv2.THRESH_BINARY_INV)
이진화
그레이스케일 이미지, 임계값, 임계값보다 클 때 적용되는 최대값, 적용방법
THRESH_BINARY_INV : 반전된 마스크 이미지 스타일
img_result = cv2.bitwise_and(img_color, img_color, mask = img_binary)
원본이미지와 바이너리 이미지에서 모두 흰색인 부분만 흰색으로 나타낸다. (And 연산)
Color 이미지
그레이 스케일 이미지
트랙바가 생성된 바이너리 이미지와 결과 이미지
실행영상