【问题标题】:Weird phenomenon when converting RGB to HSV manually in Matlab在 Matlab 中手动将 RGB 转换为 HSV 时的奇怪现象
【发布时间】:2017-01-30 20:36:41
【问题描述】:

我编写了一个小的 Matlab 函数,它采用 RGB 格式的图像并根据找到的转换公式将其转换为 HSV here

问题是,当我将其应用于色谱时,光谱中有一个切口并且某些值是错误的,请参阅图像(为了使比较更容易,我使用了内部 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,输入数据是图像“原始光谱”。原始公式将色调定义为从 0 到 360 的度数。由于 matlab 中值的范围是从 0 到 1,我试图调整公式公式,但我犯了一个错误。感谢您指出问题。我将添加正确的代码作为解决方案。

标签: matlab converter rgb hsv


【解决方案1】:

错误在于我对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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多