Engee 文档
Notebook

用 HSV 和阈值处理 RGB

本例说明了将 RGB 转换为 HSV 并使用这种表示法如何有助于简化分割过程。

该功能的实现首先要连接库。

In [ ]:
Pkg.add(["LinearAlgebra", "TestImages"])
In [ ]:
using Images, TestImages, LinearAlgebra

让我们加载一个测试图像。

In [ ]:
rgb_img = testimage("lighthouse")
Out[0]:
No description has been provided for this image

HSV(色相、饱和度、值)是一种色彩模型,其中的色彩坐标为

色调 - 色调,如红色、绿色或蓝色; 饱和度--饱和度,该参数越高,颜色越 "干净"; 3; 3.值 - 颜色的值。

让我们将原始 RGB 图像转换为 HSV 表示法。

In [ ]:
hsv_img = HSV.(rgb_img);

选择 HSV 图像的通道。

In [ ]:
channels = channelview(float.(hsv_img));

hue_img = channels[1,:,:];
value_img = channels[3,:,:];
saturation_img = channels[2,:,:];

然后,通过定义 HSV 通道的阈值,就可以高效地进行简单的图像分割。

In [ ]:
mask = zeros(size(hue_img))
h, s, v = 80, 150, 150
for ind in eachindex(hue_img)
    if hue_img[ind] <= h && saturation_img[ind] <= s/255 && value_img[ind] <= v/255
        mask[ind] = 1
    end
end
binary_img = colorview(Gray, mask)
Out[0]:
No description has been provided for this image

得到的二值图像可用作原始 RGB 图像的掩码。

In [ ]:
segmented_img = mask .* rgb_img
hcat(rgb_img, binary_img, segmented_img)
Out[0]:
No description has been provided for this image

结论

在本演示中,我们学习了如何将 RGB 转换为 HSV,以及如何使用这种表示方法来促进图像分割过程。