基于FPGA的色域空间转换的方法与流程

文档序号:14070987阅读:242来源:国知局

本发明属于工业机器视觉领域,具体涉及到一种基于fpga的rgb色域空间向hsv色域空间高速转换方法的实现方法。



背景技术:

rgb色彩模型是工业界的一种色彩标准,是通过对红绿蓝三色通道的变化以及他们相互之间的叠加来得到模型色彩的;hsv色彩模型则是根据颜色的直观特性,将模型中颜色的划分为色调,饱和度,明度三个通道;与rgb色彩模型相比,hsv色彩模型更加适合于图像分割方面的应用。在工业机器视觉领域,由于图像传感器采集的图像数据通常为rgb色彩模型,所以经常需要对图像数据进行色域空间的转换;在传统的技术中,通常由dsp或者上位机完成色域空间转换算法的实现,这样难以做到图像数据色域空间的实时转换。



技术实现要素:

本发明针对现有技术的不足,提出了一种基于fpga的rgb色域空间向hsv色域空间高速转换的方法:采用流水线式结构对输入的图像数据进行转换处理,将处理过程分为并行的五个部分,采用五级流水的方式完成一个像素数据的转换处理。在流水线的第一部分接收一个像素的rgb三个分量值并寄存,在流水线的第二部分完成并位以及减法操作,确定这个像素rgb三个分量值的大小排序情况;在流水线的第三部分根据这像素的rgb三个分量的大小排序情况以及rgb色域空间向hsv色域空间转换的公式为流水线下部分所需的参数赋值,在流水线的第四部分调用除法模块并将所需参数输入除法模块,应用得到的除法模块输出结果在流水线的第五部分计算得到色域空间转换后的hsv三个分量的值。

rgb色域空间向hsv色域空间高速转换方法的实现步骤包括:

步骤一:定义寄存器r_raw,g_raw,b_raw用来存放一个像素的rgb三个分量的原始数据值,并采集接收这三个值,该步骤位于流水线的第一部分;

步骤二:定义sub_r_g,sub_g_r,sub_r_b,sub_b_r,sub_b_g和sub_g_b;6个差值寄存器用来存放r_raw,g_raw,b_raw三个寄存器中两两之间的差值;并对6个差值寄存器进行赋值;其中sub_r_g的值等于r_raw在最高位前并上一个0后的值减去g_raw在最高位前并上一个0后的值;sub_g_r的值等于g_raw值减去r_raw的值;sub_b_r的值等于b_raw在最高位前并上一个0后的值减去r_raw在最高位前并上一个0后的值;sub_r_b的值等于r_raw值减去b_raw的值;sub_g_b的值等于g_raw在最高位前并上一个0后的值减去b_raw在最高位前并上一个0后的值;sub_b_g的值等于b_raw值减去g_raw的值。该步骤位于流水线的第二部分;

步骤三:取sub_r_g,sub_g_b,sub_b_r这三个差值寄存器的最高位并成一个3位数据寄存于寄存器comp,根据这个comp的值来判断原始像素的rgb三个分量大小排序情况。

当做减法运算时在减数和被减数的最高位前并上1个0作为标志位,再进行减法运算,若是大数减去小时,则被减数的高位不借位,差值的最高位还是0;如果是小数减去大数,在被减数的高位会借位,差值的最高位会变成1。对于一个像素的rgb三个分量值,除去rgb都相等的情况,共有6种排列方式;因此根据comp的值就可以6种情况列举出来:当comp等于001时可得r_raw>g_raw>b_raw;当comp等于011时可得r_raw>b_raw>g_raw;当comp等于101时可得g_raw>r_raw>b_raw;当comp等于100时可得g_raw>b_raw>r_raw;当comp等于010时可得b_raw>r_raw>g_raw;当comp等于110时可得b_raw>g_raw>r_raw。该步骤位于流水线的第二部分;

步骤四:定义符号标志位sign_flag;定义计算h分量时用到的被除数寄存器h_dividend,除数寄存器h_divisor以及加数寄存器h_add;定义计算s分量时用到的被除数寄存器s_dividend以及除数寄存器s_divisor;定义计算分量v时用到的缓存寄存器v;

当comp的值等于001时令sign_flag等于0,h_dividend的值等于60*sub_g_b的值,h_divisor的值等于sub_r_b的值,h_addd的值等于0,s_dividend的值等于(2n-1)*sub_r_b的值,其中n的值为输出数据的位宽,s_divisor的值等于r_raw的值,v的值等于r_raw的值;当comp的值等于011时令sign_flag等于1,h_dividend的值等于60*sub_b_g的值,h_divisor的值等于sub_r_g的值,h_addd的值等于360,s_dividend的值等于(2n-1)*sub_r_g的值,s_divisor的值等于r_raw的值,v的值等于r_raw的值;当comp的值等于101时令sign_flag等于1,h_dividend的值等于60*sub_r_b的值,h_divisor的值等于sub_g_b的值,h_addd的值等于120,s_dividend的值等于(2n-1)*sub_g_b的值,s_divisor的值等于g_raw的值,v的值等于g_raw的值;当comp的值等于100时令sign_flag等于0,h_dividend的值等于60*sub_b_r的值,h_divisor的值等于sub_g_r的值,h_addd的值等于120,s_dividend的值等于(2n-1)*sub_g_r的值,s_divisor的值等于g_raw的值,v的值等于g_raw的值;当comp的值等于010时令sign_flag等于0,h_dividend的值等于60*sub_r_g的值,h_divisor的值等于sub_b_g的值,h_addd的值等于240,s_dividend的值等于(2n-1)*sub_b_g的值,s_divisor的值等于b_raw的值,v的值等于b_raw的值;当comp的值等于110时令sign_flag等于1,h_dividend的值等于60*sub_r_g的值,h_divisor的值等于sub_b_g的值,h_addd的值等于240,s_dividend的值等于(2n-1)*sub_b_g的值,s_divisor的值等于b_raw的值,v的值等于b_raw的值;当comp的值不等于上述值时令sign_flag等于0,h_dividend的值等于0,h_divisor的值等于1,h_addd的值等于0,s_dividend的值等于0的值,s_divisor的值等于1的值,v的值等于r_raw的值;

由于s分量的定义是rgb三个分量中的最大值减去最小值再除以最大值后得到的商,是一个位于0到1之间的小数,因为输出的位宽为n位,所以在进行s分量的计算时先将被除数乘以(2n-1),这样就将s分量的值域映射到0到(2n-1)的范围上;该步骤位于流水线的第三部分;

步骤五:调用两个lpm除法模块u_div_h、u_div_s分别用于计算h分量以及s分量,除法模块u_div_h的被除数为h_diviend除数为h_divisor,将其结果存入寄存器h_quotient中,除法模块u_div_s的被除数为s_diviend除数为s_divisor,将其结果存入寄存器s_quotient中。该步骤位于流水线的第四部分;

步骤六:根据除法模块的结果计算hsv三个分量的值并输出:根据sign_flag的值确定h分量的值,当sign_flag等于0时h分量的值等于h_quotient的值加上h_add的值,当sign_flag等于1时h分量的值等于h_add的值减去h_quotient的值,因为输出的位宽位n位,h分量的值域为0到360,所以对h分量进行值域换算:当(2n-1)大于360时,输出的h分量值为计算所得到的值乘上((2n-1)/360),将值域扩大并保证在0到(2n-1)范围内,当(2n-1)小于360时,输出的h分量值为计算所得到的值除以(360/(2n-1))+1,将值域缩小并保证在0到(2n-1)范围内;s分量的值等于s_quotient的值,v分量的值就等于步骤五中寄存器v的值。该步骤位于流水线的第五部分。

与现有的技术相比,本发明的有益效果是:实现了一种基于fpga的rgb色域空间向hsv色域空间高速转换的方法,采用流水线式结构对输入的图像数据进行转换处理,能在单时钟后输出转换结果,通过硬件的方式对采集的图像数据进行实时的色域空间的转换,大大提高了图像色域空间的转换速度,为后续的图像处理提供了极大的便利。

附图说明

图1为rgb色域空间向hsv色域空间转换的算法流程图;

图2为实现算法的流水线式结构示意图。

具体实施方式

一种基于fpga的rgb色域空间向hsv色域空间高速转换的方法;如图1所示:rgb色域空间向hsv色域空间转换的算法首先读入一个原始图像像素值并存r_raw,g_raw,b_raw寄存器中,然后进行差值计算,令sub_r_g的值等于r_raw在最高位前并上一个0后的值减去g_raw在最高位前并上一个0后的值;sub_g_r的值等于g_raw值减去r_raw的值;sub_b_r的值等于b_raw在最高位前并上一个0后的值减去r_raw在最高位前并上一个0后的值;sub_r_b的值等于r_raw值减去b_raw的值;sub_g_b的值等于g_raw在最高位前并上一个0后的值减去b_raw在最高位前并上一个0后的值;sub_b_g的值等于b_raw值减去g_raw的值;接着取sub_r_g,sub_g_b,sub_b_r这三个差值寄存器的最高位并成一个3位数据寄存于寄存器comp,根据这个comp的值来判断原始像素的rgb三个分量大小排序情况;最后根据不同的rgb三个分量大小排序情况应用对应的转换公式求出hsv分量的值。

如图2所示:采用流水线式结构对输入的图像数据进行转换处理,将处理过程分为并行的五个部分,采用五级流水的方式完成一个像素数据的转换处理。在流水线的第一部分接收一个像素的rgb三个分量值并寄存,在流水线的第二部分完成并位以及减法操作,确定这个像素rgb三个分量值的大小排序情况;在流水线的第三部分根据这像素的rgb三个分量的大小排序情况以及rgb色域空间向hsv色域空间转换的算法公式为流水线下部分所需的参数赋值,在流水线的第四部分调用除法模块并将所需参数输入除法模块,应用得到的除法模块输出结果在流水线的第五部分计算得到色域空间转换后的hsv三个分量的值。

rgb色域空间向hsv色域空间高速转换方法的实现步骤包括:

步骤一:定义寄存器r_raw,g_raw,b_raw用来存放一个像素的rgb三个分量的原始数据值,并采集接收这三个值,该步骤位于流水线的第一部分;

步骤二:定义sub_r_g,sub_g_r,sub_r_b,sub_b_r,sub_b_g和sub_g_b;6个差值寄存器用来存放r_raw,g_raw,b_raw三个寄存器中两两之间的差值;并对6个差值寄存器进行赋值;其中sub_r_g的值等于r_raw在最高位前并上一个0后的值减去g_raw在最高位前并上一个0后的值;sub_g_r的值等于g_raw值减去r_raw的值;sub_b_r的值等于b_raw在最高位前并上一个0后的值减去r_raw在最高位前并上一个0后的值;sub_r_b的值等于r_raw值减去b_raw的值;sub_g_b的值等于g_raw在最高位前并上一个0后的值减去b_raw在最高位前并上一个0后的值。sub_b_g的值等于b_raw值减去g_raw的值。该步骤位于流水线的第二部分;

步骤三:取sub_r_g,sub_g_b,sub_b_r这三个差值寄存器的最高位并成一个3位数据寄存于寄存器comp,根据这个comp的值来判断原始像素的rgb三个分量大小排序情况。

当做减法运算时在减数和被减数的最高位前并上1个0作为标志位,再进行减法运算,若是大数减去小时,则被减数的高位不借位,差值的最高位还是0;如果是小数减去大数,在被减数的高位会借位,差值的最高位会变成1。对于一个像素的rgb三个分量值,除去rgb都相等的情况,共有6种排列方式;因此根据comp的值就可以6种情况列举出来:当comp等于001时可得r_raw>g_raw>b_raw;当comp等于011时可得r_raw>b_raw>g_raw;当comp等于101时可得g_raw>r_raw>b_raw;当comp等于100时可得g_raw>b_raw>r_raw;当comp等于010时可得b_raw>r_raw>g_raw;当comp等于110时可得b_raw>g_raw>r_raw。该步骤位于流水线的第二部分;

步骤四:定义符号标志位sign_flag;定义计算h分量时用到的被除数寄存器h_dividend,除数寄存器h_divisor以及加数寄存器h_add;定义计算s分量时用到的被除数寄存器s_dividend以及除数寄存器s_divisor;定义计算分量v时用到的缓存寄存器v。该步骤位于流水线的第三部分;

步骤五:根据comp的结果对步骤四中定义的寄存器进行赋值:当comp的值等于001时令sign_flag等于0,h_dividend的值等于60*sub_g_b的值,h_divisor的值等于sub_r_b的值,h_addd的值等于0,s_dividend的值等于255*sub_r_b的值,其中n的值为输出数据的位宽,s_divisor的值等于r_raw的值,v的值等于r_raw的值;当comp的值等于011时令sign_flag等于1,h_dividend的值等于60*sub_b_g的值,h_divisor的值等于sub_r_g的值,h_addd的值等于360,s_dividend的值等于255*sub_r_g的值,s_divisor的值等于r_raw的值,v的值等于r_raw的值;当comp的值等于101时令sign_flag等于1,h_dividend的值等于60*sub_r_b的值,h_divisor的值等于sub_g_b的值,h_addd的值等于120,s_dividend的值等于255*sub_g_b的值,s_divisor的值等于g_raw的值,v的值等于g_raw的值;当comp的值等于100时令sign_flag等于0,h_dividend的值等于60*sub_b_r的值,h_divisor的值等于sub_g_r的值,h_addd的值等于120,s_dividend的值等于255*sub_g_r的值,s_divisor的值等于g_raw的值,v的值等于g_raw的值;当comp的值等于010时令sign_flag等于0,h_dividend的值等于60*sub_r_g的值,h_divisor的值等于sub_b_g的值,h_addd的值等于240,s_dividend的值等于255*sub_b_g的值,s_divisor的值等于b_raw的值,v的值等于b_raw的值;当comp的值等于110时令sign_flag等于1,h_dividend的值等于60*sub_r_g的值,h_divisor的值等于sub_b_g的值,h_addd的值等于240,s_dividend的值等于255*sub_b_g的值,s_divisor的值等于b_raw的值,v的值等于b_raw的值;当comp的值不等于上述值时令sign_flag等于0,h_dividend的值等于0,h_divisor的值等于1,h_addd的值等于0,s_dividend的值等于0的值,s_divisor的值等于1的值,v的值等于r_raw的值;

由于s分量的定义是rgb三个分量中的最大值减去最小值再除以最大值后得到的商,是一个位于0到1之间的小数,因为输出的位宽为8位,所以在进行s分量的计算时先将被除数乘以255,这样就将s分量的值域映射到0到255的范围上;

步骤六:调用两个lpm除法模块u_div_h,u_div_s分别用于计算h分量以及s分量,除法模块u_div_h的被除数为h_diviend除数为h_divisor,将其结果存入寄存器h_quotient中,除法模块u_div_s的被除数为s_diviend除数为s_divisor,将其结果存入寄存器s_quotient中。该步骤位于流水线的第四部分;

步骤七:根据除法模块的结果计算hsv三个分量的值并输出:根据sign_flag的值确定h分量的值,当sign_flag等于0时h分量的值等于h_quotient的值加上h_add的值,当sign_flag等于1时h分量的值等于h_add的值减去h_quotient的值,因为输出的位宽位8位,h分量的值域为0到360,所以对h分量进行值域换算:输出的h分量值为计算所得到的值除以2,将值域映射到0到180的范围内;s分量的值等于s_quotient的值,v分量的值就等于步骤五中寄存器v的值。该步骤位于流水线的第五部分。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1