用 HSV 和阈值处理 RGB¶
本例说明了将 RGB 转换为 HSV 并使用这种表示法如何有助于简化分割过程。
该功能的实现首先要连接库。
In [ ]:
Pkg.add(["LinearAlgebra", "TestImages"])
In [ ]:
using Images, TestImages, LinearAlgebra
让我们加载一个测试图像。
In [ ]:
rgb_img = testimage("lighthouse")
Out[0]:
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]:
得到的二值图像可用作原始 RGB 图像的掩码。
In [ ]:
segmented_img = mask .* rgb_img
hcat(rgb_img, binary_img, segmented_img)
Out[0]:
结论¶
在本演示中,我们学习了如何将 RGB 转换为 HSV,以及如何使用这种表示方法来促进图像分割过程。