文章目錄
- 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)分割結果圖