OpenCV

[OpenCV with Python]영상처리 : 특정 색상 영역 추출

AI 그게 뭔데 2022. 2. 1. 14:05
특정 색상 영역 추출

 

특정 색상 영역 추출할 때 HSV 색 공간을 이용하는게 좋다.

RGB는 어두운 사진에서 색상 영역 추출하면 잘 되지 않는다. HSV는 H,S로 색상을 조절하고 V는 밝기를 조절하므로 H와 S 범위만 지정해 준다면 어두운 영상에서도 색상 영역 추출을 할 수 있다.

 

 

RGB  공간에  영역 추출하기

 

명도를 낮췄을 경우

 

명도를 낮췄을 경우 녹색이 제대로 잡히지 않은 것을 볼 수 있다.

 

import sys
import numpy as np
import cv2


src = cv2.imread('candies.png') # 원본 이미지
src2 = cv2.imread('candies2.png') # 명도가 낮은 이미지

if src is None:
    print('Image load failed!')
    sys.exit()


dst1 = cv2.inRange(src, (0, 128, 0), (100, 255, 100))
dst2 = cv2.inRange(src2, (0, 128, 0), (100, 255, 100))

cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.imshow('src2', src2)
cv2.imshow('dst2', dst2)
cv2.waitKey()

cv2.destroyAllWindows()

 

 

HSV  공간에  영역 추출하기

 

명도를 낮췄을 경우

 

HSV의 경우 명도가 낮은 경우에도 제대로 잡아내는 것을 볼 수 있다. 

 

import sys
import numpy as np
import cv2

src = cv2.imread('candies.png')  # 원본 이미지
src2 = cv2.imread('candies2.png')  # 명도가 낮은 이미지

if src is None:
    print('Image load failed!')
    sys.exit()

src_hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
src_hsv2 = cv2.cvtColor(src2, cv2.COLOR_BGR2HSV)

dst1 = cv2.inRange(src_hsv, (50, 150, 0), (80, 255, 255))
dst2 = cv2.inRange(src_hsv2, (50, 150, 0), (80, 255, 255))

cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.imshow('src2', src2)
cv2.imshow('dst2', dst2)
cv2.waitKey()

cv2.destroyAllWindows()

 

 

      검출  -  cv2.inRange

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

 

트랙바 이용  색상  추출

import sys
import numpy as np
import cv2

src = cv2.imread('candies.png')

if src is None:
    print('Image load failed!')
    sys.exit()

src_hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)


def on_trackbar(pos):
    hmin = cv2.getTrackbarPos('H_min', 'dst')
    hmax = cv2.getTrackbarPos('H_max', 'dst')

    dst = cv2.inRange(src_hsv, (hmin, 150, 0), (hmax, 255, 255))
    cv2.imshow('dst', dst)


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

cv2.createTrackbar('H_min', 'dst', 50, 179, on_trackbar)
cv2.createTrackbar('H_max', 'dst', 80, 179, on_trackbar)
on_trackbar(0)

cv2.waitKey()

cv2.destroyAllWindows()