【发布时间】: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,我试图调整公式公式,但我犯了一个错误。感谢您指出问题。我将添加正确的代码作为解决方案。