import cv2
def nothing(x):
pass
cv2.namedWindow('Binary')
cv2.createTrackbar('threshold','Binary',0,255,nothing)
cv2.setTrackbarPos('threshold', 'Binary',127)
img_color = cv2.imread('red_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)
cv2.imshow('Binary',img_binary)
img_result = cv2.bitwise_or(img_color,img_color,mask =img_binary)
cv2.imshow('Result', img_result)
if cv2.waitKey(1)&0xff == 27:
break
cv2.destroyAllWindows()
def nothing(x):
pass
더미 함수로 사용하지는 않지만 트랙바를 생성하기 위해 필요하다.
cv2.namedWindow('Binary')
트랙바를 붙일 윈도우 생성한다.
cv2.createTrackbar('threshold','Binary',0,255,nothing)
cv.createTrackbar(트랙바의 식별자, 트랙바를 이름이 'Binary' 윈도우에 붙임, 트랙바로 조종 가능한 최소값, 최대값, 더미함수)
트랙바로 조종 가능한 최소값 0, 최대값 255로 설정
cv2.setTrackbarPos('threshold', 'Binary',127)
트랙바의 초기값(127)로 설정한다.
img_color = cv2.imread('red_ball.jpg',cv2.IMREAD_COLOR)
cv2.imshow('Color',img_color)
하나의 픽셀은 3개의 채널로 구성된다.
R,G,B 3개의 채널이 각각 0 ~ 255 값을 가질 수 있다.
img_gray = cv2.cvtColor(img_color,cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray',img_gray)
하나의 픽셀은 1개의 채널을 가진다.
가장 어두운 검은색(0) ~ 가장 밝은 흰색(255) 값을 가질 수 있다.
while(True):
트랙바를 이동시 결과를 바로 확인 할 수 있도록 추가한다.
low= cv2.getTrackbarPos('threshold','Binary')
트랙바의 현재값을 가져와 TRESH HOLD 함수의 임계값으로 사용 할 수 있도록 한다.
ret,img_binary =cv2.threshold(img_gray,low,255,cv2.THRESH_BINARY_INV)
cv2.imshow('Binary',img_binary)
cv2.threshold(이진화할 대상이미지-Gray Scale 이미지 이어야함, Thresh Hold 함수의 임계값 - 이 값을 기준으로 검정색 / 흰색 결정, 4번째 인자의 결과 이미지 픽셀 값, THRESH_BINARY_INV )
Thresh Hold 값과 입력 이미지 픽셀 값을 비교 후 결과에 따라 결과 이미지 픽셀 값을 결정
- THRESH_BINARY
THRESH HOLD < 입력 이미지 픽셀 -> 결과 이미지 픽셀 값 = 3번 째 인자 값(255)
THRESH HOLD < 입력 이미지 픽셀 -> 결과 이미지 픽셀 값 = 0- THRESH_BINARY_INV
THRESH_BINARY의 반전
임계값을 기준으로 흰색(255)과 검은색(0) 두 가지 픽셀 값만 가진다.
img_result = cv2.bitwise_or(img_color,img_color,mask =img_binary)
cv2.imshow('Result', img_result)
원본 이미지와 Binary 이미지를 AND 연산한다.
한계
Gray Scale 이미지로 변환하면서 픽셀 색의 컬러 유사성을 고려 하지 않기 때문에 컬러 이미지에서는 전혀 다른색도 Gray Scale 이미지에서는 유사한 색으로 보인다.
이 문제를 개선하기 위해 이미지를 HSV 색공간으로 변환해야한다.