2017-01-30 18 views
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 

Original spectrum オリジナルスペクトルである Reconverted Converted spectrum 変換されたスペクトル

+0

コードを入力していただきありがとうございますが、結果データを複製するには入力データが必要です。つまり、 'a 'を計算するときに' mod(...、1) 'が疑わしいと思っています... – Justin

+0

@Justin、入力データは画像"オリジナルスペクトル "です。元の数式は0から360までの度数で色相を定義します。matlabの値の範囲は0から1までですので、式の式を調整しようとしましたが間違いました。問題を指摘していただきありがとうございます。 解決策として正しいコードを追加します。 – Kajsa

答えて

0

エラーは、a,b、およびcの計算を簡略化しています。これを次のように変更すると、問題が解決しました。

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 = D ./ MAX; 
I_H = zeros(size(I_V)); 

a = 1/6*mod(((I_g - I_b) ./ D),6); 
b = 1/6*((I_b - I_r) ./ D + 2); 
c = 1/6*((I_r - I_g) ./ D + 4); 
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 

     if MAX(m,n) == 0 
      S(m,n) = 0; 
     end 
    end 
end 

I_HSV = cat(3,I_H,I_S,I_V); 

end 
関連する問題