数字图像处理100问—05HSV 变换

提示:内容整理自:https://github.com/gzr2017/ImageProcessing100Wen
CV小白从0开始学数字图像处理

05HSV 变换

使用 HSV 表示色彩图像的色调反转

HSV 即使用**色调(Hue)、饱和度(Saturation)、明度(Value)**来表示色彩的一种方式。

  • 色调:将颜色使用0到360度表示,就是平常所说的颜色名称,如红色、蓝色。色相与数值按下表对应:

    绿 青色 蓝色 品红
    0 60 120 180 240 300 360
  • 饱和度:是指色彩的纯度,饱和度越低则颜色越黯淡( 0<= S < 1);

  • 明度:即颜色的明暗程度。数值越高越接近白色,数值越低越接近黑色 ( 0 <= V < 1);

代码如下:

1.引入库

CV2计算机视觉库

import cv2
import numpy as np

2.读入数据

img = cv2.imread("imori.jpg").astype(np.float32) / 255.

3.从 RGB 色彩表示转换到 HSV 色彩

out = np.zeros_like(img)

max_v = np.max(img, axis=2).copy()
min_v = np.min(img, axis=2).copy()
min_arg = np.argmin(img, axis=2)

H = np.zeros_like(max_v)

H[np.where(max_v == min_v)] = 0
## if min == B
ind = np.where(min_arg == 0)
H[ind] = 60 * (img[..., 1][ind] - img[..., 2][ind]) / (max_v[ind] - min_v[ind]) + 60
## if min == R
ind = np.where(min_arg == 2)
H[ind] = 60 * (img[..., 0][ind] - img[..., 1][ind]) / (max_v[ind] - min_v[ind]) + 180
## if min == G
ind = np.where(min_arg == 1)
H[ind] = 60 * (img[..., 2][ind] - img[..., 0][ind]) / (max_v[ind] - min_v[ind]) + 300
    
V = max_v.copy()
S = max_v.copy() - min_v.copy()

# Transpose Hue
H = (H + 180) % 360

4.从 HSV 色彩表示转换到 RGB 色彩

C = S
H_ = H / 60
X = C * (1 - np.abs( H_ % 2 - 1))
Z = np.zeros_like(H)

vals = [[Z,X,C], [Z,C,X], [X,C,Z], [C,X,Z], [C,Z,X], [X,Z,C]]

for i in range(6):
    ind = np.where((i <= H_) & (H_ < (i+1)))
    out[..., 0][ind] = (V-C)[ind] + vals[i][0][ind]
    out[..., 1][ind] = (V-C)[ind] + vals[i][1][ind]
    out[..., 2][ind] = (V-C)[ind] + vals[i][2][ind]

out[np.where(max_v == min_v)] = 0
out = (out * 255).astype(np.uint8) 

5.保存结果

cv2.imwrite("out.jpg", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. HSV后结果

数字图像处理100问—05HSV 变换_第1张图片数字图像处理100问—05HSV 变换_第2张图片

你可能感兴趣的:(数字图像处理100问,python,计算机视觉,opencv,图像处理,人工智能)