簡體   English   中英

rgb_to_hsv並使用python和numpy向后

[英]rgb_to_hsv and backwards using python and numpy

我試圖按照此答案中的描述在此處執行此代碼。 我似乎無法擺脫零值除法。

我試圖從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或dif進行除法的任何地方都會得到它的例外(因為它們的值為零)。

我在@unutbu,runtimewarning的原始代碼上遇到了相同的問題。 Caman似乎分別針對每個r,g,b組合在每個像素中執行此操作。

我還得到了形狀不匹配的ValueError:執行select函數時,對象無法廣播到單個形狀。 但是我仔細檢查了所有選擇的形狀,它們都是(256,256)

編輯:我更正了使用此Wikipedia文章的功能,並更新了代碼...現在我只獲得了runimeWarning

該錯誤來自以下事實: 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語句,因為它還會評估其所有參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM