在matlab / octave中转换RGB和HSV值

时间:2017-05-05 17:32:19

标签: matlab image-processing colors octave

我创建了一个动画,使用rgb2hsv查看RGB的不同值和等效的HSV值,但colors don't match at all我使用的转换错误了吗? 我希望获得相似的颜色,并获得与RGB值相同的HSV值,我该怎么做?

示例代码我曾经在下面用动画进行测试。

rgb2hsv values

clear all,clf reset,tic,clc
pkg load image
for ii=1:5:255
  ii;

  r(:,:,1)=127;
  g(:,:,1)=mod(19+ii,255);
  b(:,:,1)=12;
  rgb_img(:,:,1)=r;
  rgb_img(:,:,2)=g;
  rgb_img(:,:,3)=b;
  rgb_img=uint8(rgb_img); %convert so Imshow an show image

  hsv_img=rgb2hsv(rgb_img);
  h=hsv_img(:,:,1);
  s=hsv_img(:,:,2);
  v=hsv_img(:,:,3);
  hsv_img=uint8(hsv_img); %convert so Imshow an show image

  pause(.0001)

  height_wanted=300;%size(img,1) %length wanted needs to stay size(repmat_rgb,1) to get all colors. only change for testing
  width_wanted=280; %width wanted can be changed

  rgb_out = imresize(rgb_img, [height_wanted, width_wanted]); %reshape output
  hsv_out = imresize(hsv_img, [height_wanted, width_wanted]); %reshape output

  str_rgb1=('RGB Values');
  str_rgb2=(sprintf('\nRed=%3d  Green=%3d  Blue=%3d',r,g,b));
  str_hsv1=('HSV Values');
  str_hsv2=(sprintf('\nHue=%0.3f  Satuation=%0.3f  Value=%0.3f',h,s,v));

  subplot(1,2,1);imshow(rgb_out); title([str_rgb1,str_rgb2]);
  subplot(1,2,2);imshow(hsv_out); title([str_hsv1,str_hsv2]);
end

Ps:我使用的是Octave 4.0,就像Matlab一样

1 个答案:

答案 0 :(得分:2)

正如其他人在评论中提到的那样,您无法像任何其他图像一样显示HSV图像,因为它是一种根本不同的颜色表示。 3-D HSV图像矩阵不会显示为MATLAB中的图像显示功能(如imshow)特别有意义,因为它们只会将它们(错误地)解释为RGB图像(即色调通道被视为红色,饱和度通道被视为绿色,值通道被视为蓝色。

您可能想要做的是分别显示每个HSV频道:

  • 色调作为HSV color map的索引。
  • 饱和度作为存在的颜色量的灰度表示(0 =灰度,1 =纯色)。
  • 该值作为亮度的灰度表示(0 =最暗,1 =最亮)。

这里有一些代码可以使图形与你的相似,但有4个图而不是2个(我相信这应该适用于MATLAB和Octave):

<div class="icon">
    <ul><a href="home.html"></ul>
    <img src="img/icons/menu-media.png"/></a>
</div>

这是动画:

enter image description here