在Matlab中手动将RGB转换为HSV时的奇怪现象

时间:2017-01-30 20:36:41

标签: matlab converter rgb hsv

我编写了一个小型Matlab函数,它根据找到的转换公式here获取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 转换光谱

1 个答案:

答案 0 :(得分:0)

错误在于我简化了abc的计算。将其更改为以下内容解决了问题。

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