7

RGB から HSV への変換では RGB 値 0 ~ 255 を取り、HSV 値 [0 ~ 360、0 ~ 1、0 ~ 1] に変換する必要があることを理解しています。たとえば、Java のこのコンバーターを参照してください。

画像で matplotlib.colors.rbg_to_hsv を実行すると、代わりに値 [0-1, 0-1, 0-360] が出力されるようです。ただし、このような画像でこの関数を使用したところ、[H、S、V] の正しい順序で機能しているように見えますが、V が大きすぎます。

例:

In [1]: import matplotlib.pyplot as plt

In [2]: import matplotlib.colors as colors

In [3]: image = plt.imread("/path/to/rgb/jpg/image")

In [4]: print image
[[[126  91 111]
  [123  85 106]
  [123  85 106]
  ..., 

In [5]: print colors.rgb_to_hsv(image)
[[[  0   0 126]
  [  0   0 123]
  [  0   0 123]
  ..., 

これらは 0 ではなく、0 と 1 の間の数値です。

これはmatplotlib.colors.rgb_to_hsvからの定義です

def rgb_to_hsv(arr):
    """
    convert rgb values in a numpy array to hsv values
    input and output arrays should have shape (M,N,3)
    """
    out = np.zeros(arr.shape, dtype=np.float)
    arr_max = arr.max(-1)
    ipos = arr_max > 0
    delta = arr.ptp(-1)
    s = np.zeros_like(delta)
    s[ipos] = delta[ipos] / arr_max[ipos]
    ipos = delta > 0
    # red is max
    idx = (arr[:, :, 0] == arr_max) & ipos
    out[idx, 0] = (arr[idx, 1] - arr[idx, 2]) / delta[idx]
    # green is max
    idx = (arr[:, :, 1] == arr_max) & ipos
    out[idx, 0] = 2. + (arr[idx, 2] - arr[idx, 0]) / delta[idx]
    # blue is max
    idx = (arr[:, :, 2] == arr_max) & ipos
    out[idx, 0] = 4. + (arr[idx, 0] - arr[idx, 1]) / delta[idx]
    out[:, :, 0] = (out[:, :, 0] / 6.0) % 1.0
    out[:, :, 1] = s
    out[:, :, 2] = arr_max
    return out

colorsys のような他の rgb_to_hsv 変換の 1 つを使用しますが、これは私が見つけた唯一のベクトル化された python 変換です。これを理解できますか?github で報告する必要がありますか?

Matplotlib 1.2.0、numpy 1.6.1、Python 2.7、Mac OS X 10.8

4

2 に答える 2

7

0 から 255 までの unsigned int RGB 値の代わりに、0 から 1 までの float RGB 値を与えると、うまく機能します。おそらく人的ミス。ただし、次のように呼び出すだけで、必要なものを取得できます。

print colors.rgb_to_hsv(image / 255)
于 2013-06-27T18:50:38.357 に答える