2013-06-27 10 views
6

RGB'den HSV'ye dönüşümün RGB değerlerini 0-255 alması ve HSV değerlerine dönüştürmesi gerektiğini anlıyorum [0-360, 0-1, 0-1]. Örneğin, bkz. Bu converter in java:matplotlib renkler rgb_to_hsv doğru çalışmıyor. Belki rapor etmelisin?

Matplotlib.colors.rbg_to_hsv dosyasını bir görüntü üzerinde çalıştırdığımda, çıktı değerleri [0-1, 0-1, 0-360] gibi görünüyor. Ancak, bu işlevi bir image like this'da kullandım ve doğru sırada [H, S, V] çalışıyor gibi görünüyor, sadece V çok büyük.

Örnek:

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] 
    ..., 

olanlar bazı sayı Burada 0 ile 1 arasında

konum 0sn değildir 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 

ben den tanımıdır renkler gibi diğer rgb_to_hsv dönüşümlerinden birini kullanır, ancak bu bulduğum tek vektörlü python. Bunu anlayabilir miyiz? Onu github üzerine rapor etmemiz gerekiyor mu?

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

cevap

6

eğer yerine 0 ile 255 arasında işaretsiz int RGB değerlerinin, güzel çalışıyor, bunu 0'dan RGB değerlerini yüzer beslemek 1. Belgelerin bu şekilde belirtilmesi ya da işlevin çok olası bir insan hatası gibi görünmeye çalışılması hoş olurdu. Ama arayarak sadece istediklerini elde edebilirsiniz:

print colors.rgb_to_hsv(image/255) 
+0

Teşekkürler Jaime, bunu çözmüş olabilir. H'nin 0-360 yerine neden 0-1 arasında bir değer gösterdiğini biliyor musunuz? – chimpsarehungry

+1

Bir renk uzayının her bir bileşenini '0-1'e normalleştirme, yasal olarak benimsenebilecek makul bir sözleşmedir. Matplotlib bunu RGB renk alanı ile yaptığından, HSV renk uzayında bunu yapmak tutarlılık kazanır. –

+0

Görüntü, 255'e kadar bölümün çalışması için dtype 'float' olmalıdır. – facuq

0

özen gösterin, kaynak açıklama devletler giriş/çıkış boyut M, N, 3 olmalı ve fonksiyon RGBA (M, N, 4 başarısız) görüntüler ithal png dosyaları.

İlgili konular