基于FPGA的RGB和HSV色空间相互转换算法

实际背景:在我们的日常生活中,通常显示屏显示的都是采用RGB色空间,但是由于在RGB色空间中,颜色属性没有独立,这样在进行图像处理时极其不方便,而HSV色空间则可以很好的解决这个问题,它把图片的色调、饱和度、亮度这些特性分开了,这样就不会导致我们对图像颜色某一属性的修改而影响到其它的属性。

转换公式:RGB色空间到HSV色空间

h的转换公式:

s的转换公式:
在这里插入图片描述

V的转换公式:

在这里插入图片描述
这些公式在数学上看起来当然很简单,但是这里包含了大量的浮点数乘除运算,而这恰恰又是FPGA最不擅长的事情,所以我们需要将上述公式硬件化。按照在FPGA中为了避免出现浮点数运算的基本思路,我们可以先将一个数放大至一定的部数,以消除小数部分,再除以一定的倍数使得我们得到的数跟原来的数大小尽可能相等。举个例子比如说要在FPGA上实现 5*0.299,我们可以先把0.299乘以2^16,得到实际上的结果为19595.264,这里我们可以近似取19595,然后我们就可以将原来的浮点运算50.299转换成现在的519595/(2的16次方)。在FPGA中除以2的16次方只需要将该数据的后面26位丢弃即可,这样就大大简便了FPGA的工作量。

所以对上述的HSV三个分量我们都需要进行公式的硬件化转变,便于其在FPGA上的实现,画出对应的硬件流程图。如下图给出一个可供参考的RGB转换成HSV的流程图。
在这里插入图片描述
在我们得到相应的HSV数据之后,我们就很方便对色调、饱和度、亮度这三种属性进行随意的修改了。但是HSV只是一个用于中间计算的色空间,这种色空间是不能在显示屏上显示的,所以为了我们能更好地看出变化效果,我们需要把经过色调或饱和度或亮度调整之后的HSV数据再次转变成RGB数据。

HSV色空间转换到RGB色空间的公式:
在这里插入图片描述
同样的这里我们也需要进行公式的硬件化调整,才能在FPGA上实现
为了能更加直观地看出进行图像调整后的变化,可以先用MATLAB仿一下看一下效果(这里的代码已经是调整之后的,即调整浮点运算为整数运算了的),调整亮度之后的对比图如下:
注:需要代码的可以留言

原图:
在这里插入图片描述

亮度饱和度增强
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jiyishizhe/article/details/103149462