Opencv

9-3 RGB 모델, HUE 모델, HSL 모델과 Opencv inRange() 명령 필터링 처리

coding art 2020. 4. 20. 19:57
728x90




Opencv를 사용하는 이미지 색상 처리 명령인 inRange()에 대해 살펴보자. RGB 모델에서는 R, G, B 각 요소의 값 지정을 통해 하나의 색을 지정할 수 있다. R, G, B 각 요소의 범위는 0~255까지 이다. 이와는 달리 HUE 에서는 RGB 모두를 함께 0~360 사이로 처리하지만 Opencv에서 테스트 해보니 0~255 로 철하고 있음에 유의하자. 이 두 가지 모델을 사용하여 실제 이미지 색상 지정이 불완전 하므로 HSL 모델이 사용된다. HSL 모델에서 H HUE이며 S는 채도로서 맑은 수채와 채도로부터 진하고 탁한 채도까지를 나타낸다. L은 밝기 즉 Brightness를 뜻한다. HSV 모델 또는 HSL 모델이라고도 한다.

다음에 사용된 코드는 튜율립 꽃 섹상 필터링에 사용된 코드와 동일하며, HSL 모델의 요소인 H,S,L 각각의 범위를 주어 다음과 같이 그려보면 쉽게 이해가 될 것이다.


Opencv에 의한 이미지 처리를 해 보면 단순 RGB 모델이나 단순 HUE 모델로는 처리 자체가 불가능하다. 라즈베리파이 카메라로 찍는 캠코더 동영상이라면 frame.arrayimage 로 삼으면 된다. 반면에 동영상이 아닌 이미지라면 cv2.imread() 로 이미지 파일을 읽어 들이면 된다. 이렇게 얻어진 이미지를 GaussianBlur 처리를 하고 안하고는 사용자의 판단에 달려 있다. 그 다음 스텝은 이미지를 Opencv 가 지정한 포맷 즉 COLOR_BGR To HSV로 반드시 변환하여 처리해야 한다. BGR RGB 와 동일한 용어이나 인텔은 Opencv 이전 예전부터 BGR 로 사용해 왔기에 그대로 Opencv 명령에도 반영되어 그대로 사용되고 있음에 유의하 .


튜율립 사진 이미지에서 HSV 색상별로 필터링 하는 요령을 살펴보자. 다음과 같이 하한 값과 상한 값 범위를 잘 주어야 원하는 필터링 된 이미지를 얻을 수 있다. 현재 튜울립 사진을 관찰해 보면 빨간색, 보라색, 노란색, 흰색 그리고 녹색 줄기를 관찰할 수 있다.다음 코드에서 살펴보면 HUE 의 상한 값이 165 로 지정되어 있다. HUE 165180으로 올려 처리하면 인접한 붉은 색 튜울립도 함께 필터링 됨을 알 수 있다. 상담히 민감하다는 느낌이 든다. 그렇다면 특정 색상을 필터링 하기 위한 요령은 무엇일까? 그림판에서 HUE 값을 읽는 방법을 사용하도록 한다.



아래 그림은 그림판의 도구의 색선택 아이콘으로 특정 점을 찍은 후 색 편집 창에서 확인한 HUE, Saturation, Lightness 참고값 들이다. 그대로 입력하면 필터링이 제대로 되지 않으므로 이 값들로부터 적절한 마진을 주어 필터링 해 보자.


#purple_detect.py

from picamera.array import PiRGBArray

from picamera import PiCamera

import time

import cv2

import sys

import numpy as np


# initialize the camera and grab a reference to the raw camera capture

camera = PiCamera()

#camera.resolution 

camera.resolution = (640, 432)

camera.framerate = 1

rawCapture = PiRGBArray(camera, size=(640, 432))

# allow the camera to warmup

time.sleep(0.1)

#lastTime = time.time()*1000.0

# capture frames from the camera

for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):


    #image = frame.array

    image = cv2.imread('tulip.jpg')

    #image = cv2.GaussianBlur(image,(11,11), cv2.BORDER_DEFAULT)

    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)



    cv2.imshow("image", image)

    lower_purple =   np.array([100,100,50])

    upper_purple =   np.array([180,255,240])

    maskpurple = cv2.inRange(hsv, lower_purple, upper_purple)

    respurple = cv2.bitwise_and(image,image, mask= maskpurple)

    #cv2.imshow('maskpurple', maskpurple)

    cv2.imshow('respurple',respurple)


    # show the frame

    key = cv2.waitKey(1) & 0xFF

    # clear the stream in preparation for the next frame

    rawCapture.truncate(0)    

# if the `q` key was pressed, break from the loop

    if key == ord("q"):

        break