2013-10-31 120 views
2

我试图执行此代码here如本答案中所述。我似乎无法摆脱零价值的分裂。rgb_to_hsv和向后使用蟒蛇和numpy

我试图从caman Js中复制这段代码,将其从rgb转换为hsv,但我得到了同样的结果。

RuntimeWarning invalide value encountered in divide 

caman代码

Convert.rgbToHSV = function(r, g, b) { 
    var d, h, max, min, s, v; 
    r /= 255; 
    g /= 255; 
    b /= 255; 
    max = Math.max(r, g, b); 
    min = Math.min(r, g, b); 
    v = max; 
    d = max - min; 
    s = max === 0 ? 0 : d/max; 
    if (max === min) { 
    h = 0; 
    } else { 
    h = (function() { 
     switch (max) { 
     case r: 
      return (g - b)/d + (g < b ? 6 : 0); 
     case g: 
      return (b - r)/d + 2; 
     case b: 
      return (r - g)/d + 4; 
     } 
    })(); 
    h /= 6; 
    } 
    return { 
    h: h, 
    s: s, 
    v: v 
    }; 
}; 

我的基础上,答案从这里

import Image 
import numpy as np 

def rgb_to_hsv(rgb): 
    hsv = np.empty_like(rgb) 
    hsv[...,3] = rgb[...,3] 
    r,g,b = rgb[...,0], rgb[...,1], rgb[...,2] 
    maxc = np.amax(rgb[...,:3], axis=-1) 
    print maxc 
    minc = np.amin(rgb[...,:3], axis=-1) 
    print minc 
    hsv[...,2] = maxc 
    dif = (maxc - minc) 
    hsv[...,1] = np.where(maxc==0, 0, dif/maxc) 
    #rc = (maxc-r)/ (maxc-minc) 
    #gc = (maxc-g)/(maxc-minc) 
    #bc = (maxc-b)/(maxc-minc) 

    hsv[...,0] = np.select([dif==0, r==maxc, g==maxc, b==maxc], [np.zeros(maxc.shape), (g-b)/dif + np.where(g<b, 6, 0), (b-r)/dif + 2, (r - g)/dif + 4]) 

    hsv[...,0] = (hsv[...,0]/6.0) % 1.0 

    idx = (minc == maxc) 
    hsv[...,0][idx] = 0.0 
    hsv[...,1][idx] = 0.0 
    return hsv 

的例外,我得到它的代码,这两个无论我划分与MAXC或DIF(因为他们具有零值)。

我在@unutbu,runtimewarning中遇到了原始代码中的相同问题。 Caman似乎在每个像素单独执行此操作,即针对每个r,g,b组合。

我还得到了形状错配的ValueError:执行select函数时,无法将对象广播为单个形状。但我双重检查的选择的所有形状和他们都(256,256)

编辑: 我纠正使用this wikipedia article功能和更新的代码...现在我只得到runimeWarning

+0

你可以请链接一些输入数据,以便我们可以重现该问题。 – Daniel

+0

http://iconbug.com/data/45/256/ee71e5424fa6f61009240ab62c956d5e.png我使用这个图像..它给我所有这些错误 https://www.google.com/mapmaker/mapfiles/small_blue_ball.png这个产生新的图像,但我仍然得到RuntimeWarning错误,但没有形状不匹配 – Apostolos

+0

仍然没有运气?我无法找出问题...我认为我的代码看起来正确 – Apostolos

回答

0

错误来自numpy.where(和numpy.select)计算其所有参数的事实,即使它们未在输出中使用。因此,在您的行hsv[...,1] = np.where(maxc==0, 0, dif/maxc),dif/maxc甚至可以计算出maxc == 0,但只有那些使用maxc != 0的元素。这意味着你的输出很好,但你仍然得到RuntimeWarning。

如果你想避免的警告(以及使你的代码更快一点),这样做:

nz = maxc != 0 # find the nonzero values 
hsv[nz, 1] = dif[nz]/maxc[nz] 

您还可以改变numpy.select声明,因为它也评估其所有参数。