【FPGA图像处理实战】- RGB与HSV互转

HSV颜色空间也是图像处理中常用一个颜色空间,主要应用于调色处理。

本文将介绍一下RGB与HSV互转,其中复杂度比“RGB与YUV互转”要高一点,涉及到除法、浮点数、有符号数的运算。

一、HSV颜色空间介绍

1、HSV颜色空间

HSV(Hue, Saturation, Value)颜色模型,也称作六角锥体模型(Hexcone Model),是A. R. Smith于1978年根据颜色的直观特性创建的一种颜色空间。

这种模型以色调(Hue)、饱和度(Saturation)和亮度(Value)为基础,能够更加自然地表示和处理颜色,因而在计算机视觉、图像处理等领域得到了广泛应用。

2、色调(Hue)

H(Hue)代表色调,是描述颜色的一种属性,用来表示颜色的种类。色调是人在视觉上区分颜色的一种方式,类似于RGB模型中的红、绿、蓝等基本颜色。

HSV模型中的色调H,通常以角度来表示,范围从0度(红色)到120度(蓝色),再到240度(洋红色),再到360度(再次回到红色)。

这种循环对应了色轮上颜色的分布。不同的色调对应着色轮上不同的颜色,例如:

- 0度到120度:从红色逐渐过渡到蓝色

- 120度到240度:从蓝色逐渐过渡到洋红色

- 240度到360度:从洋红色逐渐过渡到红色

在HSV模型中,色调H在数值上是对饱和度和亮度进行加权的,即在保持饱和度和亮度不变的情况下,调整色调可以得到不同颜色。色调H的变化会影响到颜色的外观,使得颜色在色轮上沿着指定的方向移动。

总的来说,HSV模型中的色调H是一种描述颜色种类的属性,它能够帮助我们区分不同的颜色,并在颜色处理和计算机视觉等领域中发挥重要作用。

3、饱和度(Saturation)

S(Saturation)代表饱和度,它是描述颜色的一种属性,用来表示颜色的纯净度和鲜艳程度。

饱和度S表示颜色的纯净度,即颜色的鲜明程度。当饱和度S为1时,表示颜色完全饱和,即颜色是最纯净、最鲜明的;而当饱和度S为0时,表示颜色完全去饱和,即颜色变为灰度,没有鲜明的色彩。

在HSV模型中,饱和度S的取值范围通常是0到1,其中:

- 0:表示颜色完全去饱和,即颜色变为灰度,没有鲜明的色彩。

- 1:表示颜色完全饱和,即颜色是最纯净、最鲜明的。

饱和度S的变化会影响到颜色的外观,使得颜色变得更加鲜艳或者更加柔和。当饱和度增加时,颜色变得更加鲜艳;而当饱和度减小时,颜色变得更加柔和,甚至变为灰度。

总的来说,HSV模型中的饱和度S是一种描述颜色纯净度和鲜艳程度的属性,它能够帮助我们调整颜色的鲜明程度,并在颜色处理和计算机视觉等领域中发挥重要作用。

4、亮度(Value)

V(Value)代表亮度,它是描述颜色的一种属性,用来表示颜色的明暗程度。

亮度V表示颜色的明暗程度,即颜色的亮丽程度。当亮度V为1时,表示颜色完全亮丽,即颜色是最明亮的;而当亮度V为0时,表示颜色完全暗淡,即颜色变为黑色。

在HSV模型中,亮度V的取值范围通常是0到1,其中:

- 0:表示颜色完全暗淡,即颜色变为黑色。

- 1:表示颜色完全亮丽,即颜色是最明亮的。

亮度V的变化会影响到颜色的外观,使得颜色变得更加明亮或者更加暗淡。当亮度增加时,颜色变得更加明亮;而当亮度减小时,颜色变得更加暗淡。

总的来说,HSV模型中的亮度V是一种描述颜色明暗程度的属性,它能够帮助我们调整颜色的明暗程度,并在颜色处理和计算机视觉等领域中发挥重要作用。

二、Python实现

1、主要函数

dst=cv2.cvtColor(src,code[, dst[, dstCn]])

参数说明:

dst(destination)就表示函数处理后的目的函数;

src(source)表示源图像;

code是opencv中色彩空间定义的宏常量,常用的有COLOR_BGR2GRAY、COLOR_GRAY2BGR、COLOR_BGR2HSV、COLOR_BGR2RGB等,但是实际上可以调用的参数多达247种。

2、实现代码

import cv2

# 1. 读取图像
rgb_image = cv2.imread('1280_720.bmp')

# 2. 将RGB图像转换为YUV图像
hsv_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2HSV)

# 3. 将YUV图像转回RGB图像
rgb_image_again = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB)

# 4. 显示图像
cv2.namedWindow("rgb", 0)
cv2.resizeWindow("rgb", 300, 180) # 设置窗口大小
cv2.namedWindow("hsv", 0)
cv2.resizeWindow("hsv", 300, 180) # 设置窗口大小
cv2.namedWindow("rgb_a", 0)
cv2.resizeWindow("rgb_a", 300, 180) # 设置窗口大小
cv2.imshow('rgb', rgb_image)
cv2.imshow('hsv', hsv_image)
cv2.imshow('rgb_a', rgb_image_again)

# 4. 设置窗口显示时间,单位为毫秒(这里设置为100秒,可以根据需要调整)
cv2.waitKey(100000)

# 5. 关闭所有窗口
cv2.destroyAllWindows()

3、实现效果

三、FPGA实现

RGB与HSV互转的公式中,可以发现其中涉及浮点数运算、除法运算,计算逻辑有一定复杂度。

对于这类数学公式类FPGA实现,首先第一步是简化运算公式和浮点数转整数,第二步写代码,第三步仿真测试。在写代码的过程中,可能需要迭代修改代码。

对数学运算不熟悉的同学,可以再看看数学运算专栏。

最新文章

最新文章