我想在RGB MATLAB中将图像从RGB空间转换为HSV并使用Hue。
然而,当我使用&#; rgb2hsv'或者我在互联网上找到的一些其他代码,Hue组件有块工件。原始图像和块工件版本的示例如下所示。
答案 0 :(得分:4)
我能够重现你的错误。对于那些正在阅读并希望自己重现此图像的人,您可以这样做:
im = imread('http://i.stack.imgur.com/Lw8rj.jpg');
im2 = rgb2hsv(im);
imshow(im2(:,:,1));
此代码将生成OP向我们展示的输出图像。
您正在直接使用Hue并显示结果。您应该注意,Hue 与RGB颜色空间的灰度强度没有相同的解释。
您应该参考definition of the Hue。色调基本上是指人类感知颜色的方式,或人类视觉系统解释的主色。这是沿HSV锥体中的圆形开口形成的角度。 RGB颜色空间可以表示为其所有颜色都被限制在立方体中。它是一个3D空间,每个轴表示有助于所讨论的彩色像素的每种基色(红色,绿色,蓝色)的数量。将像素转换为HSV(也称为 Hue-Saturation-Value )会将RGB颜色空间转换为圆锥。锥体可以通过距离锥体原点的距离和向上移动(值),从锥体中心向外移动的距离(饱和度)以及锥体圆形开口周围的角度(色调)进行参数化。 / p>
这就是HSV锥体的样子:
来源:Wikipedia
色相角度与显色/感知色之间的映射如下所示:
来源:Wikipedia
如您所见,每个角度都表示主色是什么。在MATLAB中,它在[0,1]
之间缩放。因此,无法正确显示Hue 。您正在使用Hue通道将此结果直接显示为灰度图像。
但是,如果你扫描这个图像中的值,并将每个结果乘以360,那么请参考我上面显示的Hue颜色表,这将表示这些颜色的主要颜色。像素位置将是。
这个故事的寓意是你不能简单地使用Hue并将结果可视化。转换为HSV当然可以用作预处理步骤,但在发生任何富有成效的事情之前,您应该在此域中进行更多处理。直接将其视为图像非常无用,正如您在输出图像中看到的那样。您可以做的是使用颜色贴图来获取色调和颜色之间的关系,就像我向您展示的Hue查找地图中一样,然后您可以对您的图像进行着色,但这实际上仅用作观察工具。< / p>
作为奖励,我们可以做的是将Hue显示为初始灰度图像,然后将适当的颜色贴图应用于图像,以便我们可以实际可视化每个位置的每种主色颜色。幸运的是,有一个内置的HSV颜色映射与我上面显示的颜色查找映射几乎相同。您只需在显示Hue频道后立即colormap hsv
即可。我们可以通过以下方式并排显示原始图像和这个着色图像:
im = imread('http://i.stack.imgur.com/Lw8rj.jpg');
im2 = rgb2hsv(im);
subplot(1,2,1);
imshow(im); title('Original Image');
subplot(1,2,2);
imshow(im2(:,:,1)); title('Hue channel - Colour coded');
colormap hsv;
这就是图中的样子:
这个数字可能有点令人困惑。它将天空标记为蓝色作为主色。虽然这很令人困惑,但这才具有实际意义。在晴朗的日子,天空是蓝色的,但是这张照片中天空呈灰色的原因可能是由于饱和度和值的贡献。饱和度是指&#34;纯粹&#34;颜色是。例如,真红色(RGB = [255,0,0]
)表示饱和度为100%。值是指颜色的强度。基本上,它指的是颜色有多暗或多亮。因此,饱和度和值很可能在此处起作用,这将使颜色呈现灰色。我们在图像中看到的几个颜色是我们期望我们如何感知颜色。例如,沿着喷气式载体一侧的红色被感知为红色,并且绿色头盔被认为是绿色的。喷射载体的下半身(显然)也被认为是红色的。我无法向你解释这一点,但饱和度和值对混合有贡献,因此整体输出颜色大约是灰色左右。
您在图像中看到的阻塞很可能是由于JPEG量化造成的。 JPEG非常有效,因为我们无法感知图像平滑区域中的任何不连续性,但图像编码的方式是它以这种方式重建它...在一种方法中,它将大大减小它所需的大小保存图像,但允许它在视觉上吸引人,就像你要查看RAW图像一样。
这里的故事的寓意是,您当然可以将Hue用作处理链的一部分,但它不是整个图片。您可能需要使用饱和度或值(甚至两者)来帮助您辨别颜色。