OpenCV 배우기 2

한준호·2021년 7월 19일
0

OpenCV 배워보기

목록 보기
2/5
post-thumbnail

3. 이진화

배경과 오브젝트 분리하기

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 색공간으로 변환해야한다.


0개의 댓글