본문 바로가기
OpenCV

BGR2HSV OpenCV 내장함수 없이 구현하기

by 187cm 2022. 4. 17.
반응형

영상처리 프로그래밍 도중 HSV 변환공식을 따라하였는데 안되서 직접 구현해본 BGR to HSV

  • OpenCV-Pythondㅡ로 배우는 영상처리 및 응용 chapter 6 화소 변환.

OpenCV 내장함수를 통한 변환.

hsv_img = cv2.cvtColor(BGR_img , cv2.COLOR_BGR2HSV)

영상처리 책 속 변환공식 -> 책이 왜 안될까.. 이상하다..

직접 구현한 HSV to RGB

단 R', G', B' 은 R/255, G/255, B/255

  • V는 기존과 같음
  • S는 V를 분모로 올림. 0과 1 사이의 값으로 나오기 때문에 255를 곱해주어야 하며
  • H는 0부터 360사이의 값이 나오기 때문에 /2를 한 후 scale을 해주어야 하는데 /2만 해줘도 됐다.
    • (cv2.convertScaleAbs 를 안해줘도 된다.)

S는 3시간 넘게 삽질하면서 처리했고 H는 Nomalize를 먼저 해주니까 되더라..?

openCV를 할 때마다 뇌가 말랑해지는거 같다. OpenCV를 배우면서 OpenCV 내장함수를 직접 구현해보는 시간


import numpy as np, cv2
import math

image = cv2.imread("images/flor_pantar.jfif", cv2.IMREAD_COLOR) # 이미지 불러오는건 봐주자..!
if image is None : raise Exception("영상파일 읽기 오류")

# HSV로 변환전 BGR채널을 나눌 공간.
blue = np.zeros(image.shape[:2], np.uint8)
green = np.zeros(image.shape[:2], np.uint8)
red = np.zeros(image.shape[:2], np.uint8)

# HSV 저장 공간.
hsv_img = np.zeros(image.shape, np.uint8)

# blue, green, red = cv2.split(image)
for row in range(image.shape[0]):
    for col in range(image.shape[1]):
        blue[row, col] = image[row, col, 0]
        green[row, col] = image[row, col, 1]
        red[row, col] = image[row, col, 2]

# cv2.cvtColor(cv2.COLOR_BGR2HSV)
for row in range(image.shape[0]):
    for col in range(image.shape[1]):
        b = blue[row, col]
        g = green[row, col]
        r = red[row, col]

        v = max(r, g, b)
        s = ((v-min(r,g,b)) / v) * 255

        b_  = b/255.0; g_ = g/255.0; r_ = r/255.0

        num = ((r_-g_) + (r_-b_)) * 0.5
        den = np.sqrt((r_-g_)**2 + (r_-b_) * (g_-b_))

        if den: theta = math.acos(num/den) * (180/np.pi)
        else: theta = 0

        if b <= g: h = theta
        else:  h = 360-theta

        hsv_img[row, col, 0] = round(h/2)
        hsv_img[row, col, 1] = int(round(s))
        hsv_img[row, col, 2] = int(v)


# 직접 구현한 BGR2HSVd와 OpenCV의 cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

cv2.imshow("dst", hsv_img)
cv2.imshow("cv hsv", cv_hsv)
cv2.imshow("image original", image)
cv2.waitKey(0)

Result

반응형

'OpenCV' 카테고리의 다른 글

OpenCV 2차원 히스토그램 만들기.  (0) 2022.04.18