1
RGBで画像を取り込み、変換式に応じてHSVに変換する小さなMatlab関数を書いています。hereMatlabでRGBを手動でHSVに変換する際の奇妙な現象
問題は、カラースペクトルに適用するとスペクトルがカットされ、いくつかの値が間違っているということです。画像を参照してください。比較が容易になるように内部のhsv2rgb()
関数を使ってRGBに変換しています。これはMatlabs独自の機能rgb2hsv()
では発生しませんが、私は私が間違ってやっていることを見つけることができません。
これは私の機能
function [ I_HSV ] = RGB2HSV(I_RGB)
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here
[MAX, ind] = max(I_RGB,[],3);
if max(max(MAX)) > 1
I_r = I_RGB(:,:,1)/255;
I_g = I_RGB(:,:,2)/255;
I_b = I_RGB(:,:,3)/255;
MAX = max(cat(3,I_r, I_g, I_b),[],3);
else
I_r = I_RGB(:,:,1);
I_g = I_RGB(:,:,2);
I_b = I_RGB(:,:,3);
end
MIN = min(cat(3,I_r, I_g, I_b),[],3);
d = MAX - MIN;
I_V = MAX;
I_S = (MAX - MIN) ./ MAX;
I_H = zeros(size(I_V));
a = 1/6*mod(((I_g - I_b) ./ d),1);
b = 1/6*(I_b - I_r) ./ d + 1/3;
c = 1/6*(I_r - I_g) ./ d + 2/3;
H = cat(3, a, b, c);
for m=1:size(H,1);
for n=1:size(H,2);
if d(m,n) == 0
I_H(m,n) = 0;
else
I_H(m,n) = H(m,n,ind(m,n));
end
end
end
I_HSV = cat(3,I_H,I_S,I_V);
end
コードを入力していただきありがとうございますが、結果データを複製するには入力データが必要です。つまり、 'a 'を計算するときに' mod(...、1) 'が疑わしいと思っています... – Justin
@Justin、入力データは画像"オリジナルスペクトル "です。元の数式は0から360までの度数で色相を定義します。matlabの値の範囲は0から1までですので、式の式を調整しようとしましたが間違いました。問題を指摘していただきありがとうございます。 解決策として正しいコードを追加します。 – Kajsa