首页 > 技术文章 > 视频处理之灰度图

xiguazai 2020-06-05 09:08 原文

欲观原文,请君移步

灰度图概念

灰度图 ,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

推荐阅读