HSV算法及其改进 (附代码)

1.HSV

HSV是一种颜色空间,它由色相(Hue)、饱和度(Saturation)和明度(Value)三个参数组成。HSV模型中,色相表示颜色的种类,饱和度表示颜色的纯度,明度表示颜色的亮度。HSV模型常用于图像处理领域,特别是在颜色识别和跟踪方面。

代码

import cv2

# 读取原图像
img = cv2.imread("example.jpg")

# 将RGB图像转换为HSV图像
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 显示原图像和HSV图像
cv2.imshow("Original Image", img)
cv2.imshow("HSV Image", img_hsv)
cv2.waitKey(0)

结果

2.HSL

HSL是一种颜色模型,它代表了颜色的三个属性:色相(Hue)、饱和度(Saturation)和亮度(Lightness)。其中,色相表示颜色的种类,饱和度表示颜色的纯度,亮度表示颜色的明暗程度。HSL模型通常用于图形软件中,用于调整和控制颜色的属性。

代码

import cv2

# 读取图像
img = cv2.imread(r'D:\papercode\experiment\2\deep-learning-for-image-processing-master\deep-learning-for-image-processing-master\amusement_0037.jpg')

# 将图像转换为HSL颜色空间
hsl_img = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)

# 获取色相滑块的值
hue_value = 90

# 调整色相属性
hsl_img[:, :, 0] = hue_value

# 将图像转换回BGR颜色空间
result_img = cv2.cvtColor(hsl_img, cv2.COLOR_HLS2BGR)

# 显示结果图像
cv2.imshow('result', result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果 

3.HSI

HSI模型将亮度分量改为了强度(Intensity),并将饱和度分量改为了饱和度(Saturation)和色调(Intensity),这样可以更好地描述颜色的强度和鲜艳程度。

代码

import numpy as np
import cv2

def rgb2hsi(img):
    # 将RGB图像转换为HSI图像
    img = img.astype(np.float32) / 255.0
    b, g, r = cv2.split(img)
    hsi = np.zeros_like(img)
    eps = 1e-6
    for i, color in enumerate([b, g, r]):
        numerator = 0.5 * ((r - g) + (r - b))
        denominator = np.sqrt((r - g) ** 2 + (r - b) * (g - b))
        theta = np.arccos(numerator / (denominator + eps))
        h = np.zeros_like(theta)
        h[color <= b] = theta[color <= b]
        h[color > b] = 2 * np.pi - theta[color > b]
        hsi[..., i] = h / (2 * np.pi)
    hsi[..., 1] = 1 - 3 * np.min(hsi[..., :3], axis=-1)
    hsi[..., 2] = np.sum(img, axis=-1) / 3.0
    return hsi

def hsi2rgb(img):
    # 将HSI图像转换为RGB图像
    img = img.copy()
    h, s, i = cv2.split(img)
    h = h * 2 * np.pi
    bgr = np.zeros_like(img)
    for i, color in enumerate([bgr[..., 0], bgr[..., 1], bgr[..., 2]]):
        if i == 0:  # Blue
            idx = np.logical_and(h >= 0, h < 2 * np.pi / 3)
            color[idx] = i + (1 - s[idx])
            idx = np.logical_and(h >= 2 * np.pi / 3, h < 4 * np.pi / 3)
            color[idx] = i + (1 - s[idx]) * (h[idx] - 2 * np.pi / 3) / (2 * np.pi / 3)
            idx = np.logical_and(h >= 4 * np.pi / 3, h < 2 * np.pi)
            color[idx] = i + s[idx]
        elif i == 1:  # Green
            idx = np.logical_and(h >= 0, h < 2 * np.pi / 3)
            color[idx] = i + s[idx] * (h[idx]) / (2 * np.pi / 3)
            idx = np.logical_and(h >= 2 * np.pi / 3, h < 4 * np.pi / 3)
            color[idx] = i + (1 - s[idx])
            idx = np.logical_and(h >= 4 * np.pi / 3, h < 2 * np.pi)
            color[idx] = i + s[idx] * (2 * np.pi - h[idx]) / (2 * np.pi / 3)
        else:  # Red
            idx = np.logical_and(h >= 0, h < 2 * np.pi / 3)
            color[idx] = i + s[idx]
            idx = np.logical_and(h >= 2 * np.pi / 3, h < 4 * np.pi / 3)
            color[idx] = i + s[idx] * (4 * np.pi / 3 - h[idx]) / (2 * np.pi / 3)
            idx = np.logical_and(h >= 4 * np.pi / 3, h < 2 * np.pi)
            color[idx] = i + (1 - s[idx])
    bgr[..., 0] = bgr[..., 0] * 255.0
    bgr[..., 1] = bgr[..., 1] * 255.0
    bgr[..., 2] = bgr[..., 2] * 255.0
    return bgr.astype(np.uint8)

# 示例代码
img = cv2.imread('example.jpg')
hsi_img = rgb2hsi(img)
rgb_img = hsi2rgb(hsi_img)
cv2.imshow('Original Image', img)
cv2.imshow('HSI Image', hsi_img)
cv2.imshow('RGB Image', rgb_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 结果

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值