文章目录
- 点操作
- 对比度与亮度调节
- 通过加减一个常量来调整亮度。
- 通过改变映射函数的斜率来调整对比度。
- 反转图像
- 非线性映射
- 灰度图反转与彩色图反转
- 灰度图反转
- 彩色图反转
点操作
首先介绍单幅图像上的点操作,如下公式所示,点操作就是对每个像素点进行独立操作,与位置无关,输出图像的某点像素只取决于输入图像中该点的对应像素
如下图所示,f 为某种映射关系,点操作也就是通过一个映射函数,将输入I映射到输出Q上。
点操作也可以并行处理,比如将图像分割成若干部分,每个部分单独进行处理。
应用场景:图像增强、图像分割、彩色滤波、变化检测、图像掩模。
本文主要介绍对比度与亮度调节,同时以其中的图像反转为特例,进行实际实现。
对比度与亮度调节
亮度和对比度的调节也是通过映射函数的改变来实现的。如下图所示:
通过加减一个常量来调整亮度。
加上一个常量,使得图像像素值增大,于是图像变亮,减去一个常量,让图像变暗。(0表示黑色,255表示白色)
通过改变映射函数的斜率来调整对比度。
乘以一个斜率大于1的常数,则增强对比度,乘以一个小于1则降低对比度。
对比度和亮度是可以同时调节的,如下公式所示:
其中a控制对比度,b控制亮度。
另外通过上述公式计算得到的输出数据Q,其结果可能超出可表示范围(0-255)的情况,因此要进行一定的裁剪(检测什么时候超出极限值,并将超出的部分裁剪掉),通过该极值来调整输出值。极限值的计算如下:
其中N表示位数,比如一般的灰度图像是8位,因此N=8,那么V=255
反转图像
通过上述的分析,在对比度调节的时候,我们考虑的斜率都是正数的情况,无非就是大于或者小于1的问题,但如果转换函数的斜率为负,即得到反转对比度,从而得到反转图像。如下图所示:
非线性映射
非线性映射的话,和上述原理一样,只不过它能使得不同的强度具有不同的效果。
如下是经典的伽马变换。其实质是先将图像的灰度值归一化到【0,1】范围,然后再对每一个像素进行幂函数操作。QN 和 IN 表示0和1之间的分数,另外伽玛曲线的设计主要是为了补偿成像系统中不同阶段传递函数的非线性。
由下图可看出,通过增加一条补偿伽马曲线,能让图像的对比度看起来更自然。
当伽马小于1的时候,曲线上移且增强了图片的对比度(变亮),反之亦然(变暗)。
灰度图反转与彩色图反转
基于反转对比度(反转图像)本文介绍两种图像反转方式:灰度图像反转以及彩色图像反转。
如下是图像反转的公式:
灰度图反转
- 首先我们对灰度图反转进行分析。灰度图是在RGB转Ycbcr的基础上进行的,其中灰度图的输入数据则是Y分量(我这里用Y2信号表示)。通过图像反转公式以及灰度图对应的位数N=8可计算出,Q = 255 - I 。
//灰度反转,在Ycbcr的基础上,取出Y分量(也就是Y2),然后进行灰度反转的运算,灰度反转的公式是 Q = V - I ,其中 V = 255
wire [7:0] Y_r;
wire [7:0] Y_rr; //这里只对公式进行展现,如果真正想要图像在VGA显示,Y_rr信号需要在端口列表设为输出output
assign Y_r = 8'd255 - Y2;
//为了显示,需要得到RGB565的数据,因此灰度反转后的图像输出数据如下
assign Y_rr = {Y_r[7:3],Y_r[7:2],Y_r[7:3]};
彩色图反转
- 如果是RGB565彩色图像,那么在进行反转的时候,RGB三个通道都进行反转,根据如下公式以及输入图像RGB位数565可计算出V,R通道的V=31,G通道的V=63,B通道的V=31,输入图像以RGB565的图像数据为基础,从而得到反转后的输出图像Q。
//彩色图反转
assign R=VGA_RGB[15:11];
assign G=VGA_RGB[10:5];
assign B=VGA_RGB[4:0];
//每个通道进行反转的运算。由于每个通道的像素位数不同,因此V也不同。R通道的V=31,G通道的V=63,B通道的V=31
assign R_r= 5'd31 - R;
assign G_r= 6'd63 - G;
assign B_r= 5'd31 - B;
//为了显示,得到RGB565的数据,因此彩色图反转后的图像输出数据如下:
assign Y_rr = {R_r,G_r,B_r};
伽马变换的实例分析这里没有展示,咸鱼FPGA中也讲解了伽马变换的实现方法,比较详细,其采用的是查找表的方式,先用matlab进行伽马变换,然后生成mif文件,将其存在rom中,然从rom中读取即可。信号同步处只延迟一个时钟,因为输入从rom中读出需要花费一个clk。