본문 바로가기

OpenCV-Python

OpenCV Python 색상 영역 검출

색상 영역 검출은 말 그대로 사진에서 해당 범위 안의 색상을 표시해줍니다.

cv2.inRange(src, lowerb, upperb [, dst]) [] : 생략 가능

import cv2
import numpy as np

src1 = cv2.imread('imgs/flower.jpg')

src1_hsv = cv2.cvtColor(src1, cv2.COLOR_BGR2HSV)

dst1 = cv2.inRange(src1, (0, 0, 100), (150, 150, 255)) # B : 0 ~ 150, G : 0 ~ 150, R : 100 ~ 255
 
dst2 = cv2.inRange(src1_hsv, (160, 200, 0), (179, 255, 255)) # H(색상) : 160 ~ 179, S(채도) : 100 ~ 255, V(진하기) : 0 ~ 255

cv2.imshow('src1', src1)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)


cv2.waitKey(0)
cv2.destroyAllWindows()

src : 입력 행렬
lowerb : 하한 값 행렬 또는 스칼라
upperb : 상한 값 행렬 또는 스칼라
dst : 입력 영상과 같은 크기의 마스크 영상(numpy.uint8)
       범위 안에 들어가는 픽셀은 255, 나머지는 0 => GrayScale 영상으로 출력

 

dst1 = cv2.inRange(src1, (0, 0, 100), (150, 150, 255)) # B : 0 ~ 150, G : 0 ~ 150, R : 100 ~ 255

R색이 나타나게는 했지만 BGR 성분은 색상 성분이 포함되기 때문에 정확히 표현하기 힘듭니다.  HSV 성분이 나타내기 쉽습니다.

dst2 = cv2.inRange(src1_hsv, (160, 200, 0), (179, 255, 255)) # H(색상) : 160 ~ 179, S(채도) : 200 ~ 255, V(진하기) : 0 ~ 255

HSV 채널은 H(Hue) 값이 색상 영역을 표현하는데 0~360이 아닌(마땅한 사진이 없네요) 0~ 180(=0)으로 전 빨간색 성분을 추출하기 위해 160~ 179을 주었고, S는 원의 중심점부터 원의 둘레 부분까지의 거리를 0 ~ 255로 표현한 것으로 좀 더 진한 빨간색을 찾고자 200 ~ 250을 주었습니다. V는 밝기 성분으로 건드리지 않았습니다. 


트랙 바를 사용하여 색상 검출

import cv2
import numpy as np

src1 = cv2.imread('imgs/flower.jpg')

src1 = cv2.resize(src1, (0, 0), fx=0.1, fy=0.1)

src1_hsv = cv2.cvtColor(src1, cv2.COLOR_BGR2HSV)


def trackbar(pos):
    hmin = cv2.getTrackbarPos('H_min', 'dst')
    hmax = cv2.getTrackbarPos('H_max', 'dst')
    smin = cv2.getTrackbarPos('S_min', 'dst')
    smax = cv2.getTrackbarPos('S_max', 'dst')

    dst = cv2.inRange(src1_hsv, (hmin, smin, 0), (hmax, smax, 255))
    cv2.imshow('dst', dst)


cv2.imshow('src1', src1)
cv2.namedWindow('dst')

cv2.createTrackbar('H_min', 'dst', 20, 179, trackbar)
cv2.createTrackbar('H_max', 'dst', 50, 179, trackbar)

cv2.createTrackbar('S_min', 'dst', 0, 255, trackbar)
cv2.createTrackbar('S_max', 'dst', 100, 255, trackbar)

trackbar(0)

cv2.waitKey(0)
cv2.destroyAllWindows()