2

我尝试按照此答案中的描述在此处执行此代码。但我似乎无法摆脱零值除法。

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

RuntimeWarning invalide value encountered in divide

卡曼代码是

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 还是用 diff 划分(因为它们的值为零),我都会得到它。

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

我还收到形状不匹配的 ValueError:执行选择功能时,无法将对象广播到单个形状。但我仔细检查了所有选项的形状,它们都是 (256,256)

编辑:我使用这篇维基百科文章更正了函数,并更新了代码......现在我只得到了 runimeWarning

4

1 回答 1

0

错误来自numpy.where(and numpy.select) 计算其所有参数的事实,即使它们未在输出中使用。因此,在您的行hsv[...,1] = np.where(maxc==0, 0, dif/maxc)中,dif / maxc即使对于 where 的元素也会计算maxc == 0,但只对 wheremaxc != 0使用的元素进行计算。这意味着您的输出很好,但您仍然会收到 RuntimeWarning。

如果您想避免警告(并使您的代码更快一点),请执行以下操作:

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

您还必须更改numpy.select语句,因为它还会评估其所有参数。

于 2013-12-02T23:21:40.913 回答