欲观原文,请君移步
#灰度图概念
灰度图 ,Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。8位像素灰度分为256阶。用灰度表示的图像称作灰度图。除了常见的卫星图像、航空照片外,许多地球物理观测数据也以灰度表示。除了常见的卫星图像、航空照片外,许多地球物理观测数据也以灰度表示。以位场图像为例,把位场表示为灰度图,需要将位场观测值灰度量化,即将场的变化范围转换成256阶的灰度范围。由于位场的动态变化范围非常大,磁场可达数万个纳特,重力场也可能在数百个重力单位内变化,所以在显示为图像前通常需要对位场观测值进行拉伸或压缩。
#灰度图计算
将彩色图像转换为灰度图像的方法有两种:
-
第一种方法是令RGB三个分量的数值相等。输出后便可以得到灰度图像。
-
第二种方法是将RGB转换为YCbCr格式,将Y分量提取出来,YCbCr格式中的Y分量表示的是图像的亮度,所以只输出Y分量,得到图像就是灰度图像。
本文采用第二种方法,采用xilinx FPGA提供的IP。
##算法基础
官方给的RGB888转YCrCb的算法公式:
Y = 0.299R + 0.587G + 0.114B
Cb = 0.568(B-Y) + 128 = -0.172R -0.339G + 0.511B + 128
Cr = 0.713(R -Y) + 128 = 0.511R - 0.428G - 0.083B + 128
矩阵表示如下
##整数算法
在实际应用时,希望避免低速的浮点运算,所以需要整数算法。
注意到系数都是3位精度,我们可以将它们缩放1000倍来实现整数运算算法:
Y = (R299 + G587 + B*114 + 500) / 1000。
RGB一般是8位精度,现在缩放1000倍,所以上面的运算是32位整型的运算。注意后面那个除法是整数除法,所以需要加上500来实现四舍五入。
就是由于该算法需要32位运算,所以该公式的另一个变种很流行(只扩大100倍):
Y = (R30 + G59 + B*11 + 50) / 100。
##FPGA实现算法
上面的整数算法已经很快了,但是有一点仍制约速度,就是最后的那个除法。FPGA实现出发很消耗资源很且很慢,移位比除法快多了,所以可以将系数缩放成2的整数幂。由于FPGA实现小数无法计算,所以进行变换(将小数扩大256,最后结果再除以256),公式如下
Y = ((77R + 150G + 29*B)>>8)
Cb = ((-43B - 85G + 128*B)>>8) + 128
Cr = ((128R - 107G - 21*B)>>8) + 128
#灰度图实现
##matlab实现结果
X=imread(I); %读入图片
I=mat2gray(X);%将数值矩阵X转换为灰度图像
figure,imshow(I); %显示转换后的灰度图像
##FPGA实现
如果你对实现过程感兴趣,可以参考链接,网友们都写的很好,小编会后面出一个各种视频格式转换的通用模块,敬请关注。
使用IP如下图所示,支持AXI Stream接口(根据视频的分辨率进行配置即可)。
RGB2YCrcb IP硬件位置
实现结果如下图
#参考链接
https://blog.csdn.net/dengxf01/article/details/53287227
https://www.cnblogs.com/huangwei0521/p/12382238.html
https://www.cnblogs.com/ninghechuan/p/6978104.html