文章目录
- 1. 介绍
- 2. HSV颜色空间
- 3. python实现HSV图像分割
- 3.1. 代码实现
- 3.2. 运行结果
1. 介绍
HSV颜色系统简介:
HSV 即使用色相(Hue)、饱和度(Saturation)、明度(Value)来表示色彩的一种方式。是一种在人们生活中常用的颜色系统,因为它符合人们描述颜色的方式——是什么颜色、颜色有多深、颜色有多亮。
(1) H H H(色相,Hue):将颜色用0°~360°来表示,常见的色相与数值按照下表对应:
红 | 黄 | 绿 | 青色 | 蓝色 | 品红 | 红 |
---|---|---|---|---|---|---|
0° | 60° | 120° | 180° | 240° | 300° | 360° |
图形可视化:
(2) S S S(饱和度,saturation):是指色彩的纯度,也可以理解为色彩的深浅度。对于同种色彩下饱和度越低则颜色越黯淡,并且有s∈[0,1)
(3) V V V(明度,value):即颜色的明暗程度。数值越高越接近白色,数值越低越接近黑色且V∈[0,1)
2. HSV颜色空间
HSV颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集:
圆锥的顶面:对应于 V = 1 V=1 V=1。 它包含RGB模型中的 R = 1 , G = 1 , B = 1 R=1,G=1,B=1 R=1,G=1,B=1 三个面,所代表的颜色较亮。
色彩 H H H 由绕V轴(圆锥的中轴)的旋转角给定。红色对应于角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180° 。
饱和度 S S S:取值从0到1,所以圆锥顶面的半径为1。
圆锥的顶点(即原点): V = 0 V=0 V=0, H H H 和 S S S 无定义, 代表黑色。
圆锥的顶面中心: S = 0 , V = 1 S=0,V=1 S=0,V=1, H H H无定义,代表白色。从该点到原点代表亮度渐暗的灰色,即具有不同灰度的灰色。对于这些点, S = 0 S=0 S=0, H H H的值无定义。
在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。
3. python实现HSV图像分割
这里我采用的是IDRiD数据集中的一张图片,目的是想试一下HSV在硬渗出物分割的表现:
3.1. 代码实现
from skimage.io import imread, imshow
from skimage import img_as_ubyte # For converting the float image to uint8
from skimage import io, color
from skimage.color import rgb2hsv
from matplotlib import pyplot as plt
import numpy as npimage_path = "img.jpg"
rgb_image = io.imread(image_path)img_hsv = rgb2hsv(rgb_image)
# -------------转换成HSV色彩空间----------------
fig, ax = plt.subplots(1, 3, figsize=(12,4))
ax[0].imshow(img_hsv[:,:,0], cmap='gray')
ax[0].set_title('Hue')
ax[1].imshow(img_hsv[:,:,1], cmap='gray')
ax[1].set_title('Saturation')
ax[2].imshow(img_hsv[:,:,2], cmap='gray')
ax[2].set_title('Value')
plt.show()
# --------------获得每个HSV通道的强度值---------------
fig2, ax2 = plt.subplots(1, 3, figsize=(20, 5))
ax2[0].imshow(img_hsv[:,:,0],cmap='hsv')
ax2[0].set_title('hue')
ax2[1].imshow(img_hsv[:,:,1],cmap='hsv')
ax2[1].set_title('transparency')
ax2[2].imshow(img_hsv[:,:,2],cmap='hsv')
ax2[2].set_title('value')# 显示colorbar,下面会用到colorbar设定阈值范围
fig2.colorbar(imshow(img_hsv[:,:,0],cmap='hsv'))
# fig2.colorbar(imshow(img_hsv[:,:,1],cmap='hsv'))
# fig2.colorbar(imshow(img_hsv[:,:,2],cmap='hsv'))fig2.tight_layout()
plt.show()
# -------------根据colorbar挑选阈值----------------
# 设定hue的阈值范围(色彩范围):(0.07, 0.22)
lower_mask = img_hsv[:, :, 0] > 0.07
upper_mask = img_hsv[:, :, 0] < 0.22
# 设定saturation的阈值范围(透明度范围):(0.78, 1)
# 注:如果有上下界就类似上面hue阈值的设置,一个最高值一个最低值
saturation_mask = img_hsv[:, :, 1] > 0.78
# 设定value的阈值范围(亮度范围):(0.7, 1)
value_mask = img_hsv[:, :, 2] > 0.7mask = upper_mask * lower_mask * saturation_mask * value_maskred = rgb_image[:, :, 0] * mask
green = rgb_image[:, :, 1] * mask
blue = rgb_image[:, :, 2] * mask
img_masked = np.dstack((red, green, blue))imshow(img_masked)
plt.show()# Save the masked image as PNG
# io.imsave("img_masked.png", img_as_ubyte(img_masked))
3.2. 运行结果
(1)以 gray模式 显示 Hue、Saturation、Value 三个通道
(2)以 hsv模式 显示 Hue、Saturation、Value 三个通道
(3)分割结果图