2

この回答で説明されているように、ここでこのコードを実行しようとしました。しかし、ゼロの値で割ることから逃れられないようです。

rgb から hsv に変換するためにこのコードを caman Js からコピーしようとしましたが、同じ結果が得られました。

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 も取得します。選択関数が実行されたときに、オブジェクトを単一の形状にブロードキャストすることはできません。しかし、選択肢のすべての形状を再確認したところ、それらはすべて (256,256)

編集:このウィキペディアの記事を使用して関数を修正し、コードを更新しました...今は runimeWarning のみを取得します

4

1 に答える 1