基于HSV空间色彩的图像分割方法(含python代码实现)


1. 介绍

HSV颜色系统简介:
HSV 即使用色相(Hue)、饱和度(Saturation)、明度(Value)来表示色彩的一种方式。是一种在人们生活中常用的颜色系统,因为它符合人们描述颜色的方式——是什么颜色、颜色有多深、颜色有多亮

(1) H H H(色相,Hue):将颜色用0°~360°来表示,常见的色相与数值按照下表对应:

绿青色蓝色品红
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 np

image_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.7

mask = upper_mask * lower_mask * saturation_mask * value_mask

red = 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)分割结果图

在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cpdr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值