Python과 OpenCV – 8 : 색상공간(Colorspace) 변경하기

이 글의 원문은 다음과 같습니다. https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html

다음과 같은 내용을 학습합니다.

  • 서로 다른 Colorspace로 변경하기. 즉 BGR을 Gray로, BGR을 HSV로 ..
  • 비디오의 영상을 통해 원하는 색상을 가진 물체 추출하기

위의 내용을 학습하면서cv2.cvtColor과 cv2.inRange 함수를 학습합니다.

먼저 색상공간 중 HSV는 Hue(색상), Saturation(채도), Value(명도)의 요소로써 각각 [0,179], [0,255], [0,255] 범위의 값을 갖습니다. HSV 중 H에 해당하는 색상값을 이용해 이미지에서 특정 색상을 띠는 물체를 추출할 수 있는데, BGR로 [255,0,0]인 파랑색을 HSV로 변환하기 위한 코드는 다음과 같습니다.

import cv2
import numpy as np

blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue,cv2.COLOR_BGR2HSV)
print(hsv_blue)

출력값은 [120 255, 255]입니다. 채도가 120인데, 이 특정색과 비슷한 계열의 색상은 [Hue-10,100,100]에서 [Hue+10,255,255]까지의 범위로 나타낼 수 있고, 채도가 120인 파란색의 경우 [110,50,50]에서 [130,255,255]까지가 됩니다.

이제 비디오 영상에 받은 이미지에서 파란색 계열의 물체를 추출해 내는 예제를 살펴보겠습니다.

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):
    _, frame = cap.read()

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

    # 앞서 설명한 파랑색 계열의 범위
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    res = cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    cv2.imshow('res', res)
    
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()

총 3개의 이미지가 표시되는데, 첫번째는 비디오로부터 받은 원본 이미지로 아래와 같습니다.

그리고 파랑색 계열에 대한 물체를 추출하기 위해 사용할 마스크 이미지는 아래와 같습니다.

최종적으로 원본 이미지와 마스크 이미지에 대한 처리를 위해 bitwise_and 연산을 사용했고 그 결과는 아래와 같습니다. 참고로 마스크 이미지의 처리를 위한 목적이므로 bitwise_or도 가능합니다.

“Python과 OpenCV – 8 : 색상공간(Colorspace) 변경하기”에 대한 2개의 댓글

    1. 연산자를 다양하게 시도하셔서 원하는 결과를 얻으시기 바랍니다~
      사실 저도 당장은 모르겠습니다. 해봐야 아는 상황~ ^^;

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다