【Python/OpenCV】RGBからHSVに変換(cv2.cvtColor)

この記事では、PythonとOpenCVを用いて画像をRGBからHSVに変換する方法をソースコード付きで解説します。

HSV色空間に変換

画像をRGBからHSVに変換する計算式と原理については下記事で紹介しています。

【参考】【画像処理】RGBからHSVへの変換

また、OpenCVライブラリでは、cv2.cvtColorメソッドでRGBからHSVに変換できます。

書式

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
パラメータ名 説明
img 入力画像(RGB)
hsv 出力画像(HSV)

今回は、「変換アルゴリズムを自前で実装する方法」と「cvtColorメソッドを利用する方法」を両方試してみました。

ソースコード(Python3)

サンプルプログラムのソースコードです。

方法①

#-*- coding:utf-8 -*-
import cv2
import numpy as np


def rgb_to_hsv(src, ksize=3):
    # 高さ・幅・チャンネル数を取得
    h, w, c = src.shape
    
    # 入力画像と同じサイズで出力画像用の配列を生成(中身は空)
    dst = np.empty((h, w, c))

    for y in range(0, h):
        for x in range(0, w):
            # R, G, Bの値を取得して0~1の範囲内にする
            [b, g, r] = src[y][x]/255.0

            # R, G, Bの値から最大値と最小値を計算
            mx, mn = max(r, g, b), min(r, g, b)
            
            # 最大値 - 最小値
            diff = mx - mn

            # Hの値を計算
            if mx == mn : h = 0
            elif mx == r : h = 60 * ((g-b)/diff)     
            elif mx == g : h = 60 * ((b-r)/diff) + 120  
            elif mx == b : h = 60 * ((r-g)/diff) + 240
            if h < 0 : h = h + 360
                
            # Sの値を計算
            if mx != 0:s = diff/mx       
            else: s = 0
            
            # Vの値を計算
            v = mx
            
            # H, S, Vの値を0~255の範囲内にして格納
            dst[y][x] = [h, s * 255, v * 255]

    return dst


def main():
    # 入力画像の読み込み
    img = cv2.imread("input.jpg")

    # 方法1(NumPyで実装)
    hsv1 = rgb_to_hsv(img)
    
    # 結果を出力
    cv2.imwrite("hsv1.jpg", hsv1)


if __name__ == "__main__":
    main()

方法①

#-*- coding:utf-8 -*-
import cv2
import numpy as np


def main():
    # 入力画像の読み込み
    img = cv2.imread("input.jpg")

    # 方法2(OpenCVで実装)       
    hsv2 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
    # 結果を出力
    cv2.imwrite("hsv2.jpg", hsv2)


if __name__ == "__main__":
    main()

実行結果

サンプルプログラムの実行結果です。

■左から入力画像(input.jpg)、出力画像(hsv2.jpg)

お借りした画像:プロ生ちゃん(暮井 慧)

【おすすめ記事】
PythonでOpenCV入門 サンプル集
【Python】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!