量化压缩与量化补偿
0赞学习博客:http://lhtao31.blog.163.com/blog/static/2972647020103814044158/
最近在学习调试摄像头,配置OV7670摄像头采集到的数据是RGB565,移植别人的代码,从ZYNQ移植到Basys3,VGA输出引脚需要又RGB565转到RGB444,我采用分别取RGB565三分量高位的方法,最终显示输出,视频图像会变得更模糊,这是由于在转换的时候去掉低位会损失精度。而OV7670的图像采集效果也是不怎么样,所以后面会尝试配置OV7725,追求完美,达到更好的显示效果。查询了很多资料后,知道了这是什么原因,下面我自己查阅的资料整理一下,以后查询起来方便。
1 /* vga_red <= frame_pixel[15:11]; 2 vga_green <= frame_pixel[10:5]; 3 vga_blue <= frame_pixel[4:0]; */ 4 vga_red <= frame_pixel[15:12]; 5 vga_green <= frame_pixel[10:7]; 6 vga_blue <= frame_pixel[4:1];
量化压缩与量化补偿
量化压缩
24bit RGB888 -> 16bit RGB565 的转换
24ibt RGB888 {R7 R6 R5 R4 R3 R2 R1 R0} {G7 G6 G5 G4 G3 G2 G1 G0} {B7 B6 B5 B4 B3 B2 B1 B0}
16bit RGB656 {R7 R6 R5 R4 R3} {G7 G6 G5 G4 G3 G2} {B7 B6 B5 B4 B3}
量化位数从8bit到5bit或6bit,取原8bit的高位,量化上做了压缩,却损失了精度。
量化补偿
16bit RGB565 -> 24bit RGB888 的转换
16bit RGB656 {R4 R3 R2 R1 R0}{G5 G4 G3 G2 G1 G0}{B4 B3 B2 B1 B0}
24ibt RGB888 {R4 R3 R2 R1 R0 0 0 0 }{G5 G4 G3 G2 G1 G0 0 0 }{B4 B3 B2 B1 B0 0 0 0}
24ibt RGB888 {R4 R3 R2 R1 R0 R2 R1 R0}{ G5 G4 G3 G2 G1 G0 G1 G0}{ B4 B3 B2 B1 B0 B2 B1 B0}
第二行的 24bit RGB888 数据为转换后,未进行补偿的数据,在精度上会有损失
24bit RGB888 数据为经过量化补偿的数据,对低位做了量化补偿
总结
量化压缩的方法:三个字——取高位
量化补偿的方法:
1. 将原数据填充至高位
2. 对于低位,用原始数据的低位进行补偿
3. 如果仍然有未填充的位,继续使用原始数据的低位进行循环补偿
循环补偿的概念
8bit RGB332 -> 24bit RGB888 的转换
8bit RGB332{ R2 R1 R0} { G2 G1 G0} { B1 B0}
24bit RGB888 { R2 R1 R0 0 0 0 0 0 }{ G2 G1 G0 0 0 0 0 0} { B1 B0 0 0 0 0 0 0}
24bit RGB888 { R2 R1 R0 R2 R1 R0 0 0 }{ G2 G1 G0 G2 G1 G0 0 0 }{ B1 B0 B1 B0 0 0 0 0}
24bit RGB888 { R2 R1 R0 R2 R1 R0 R2 R1} { G2 G1 G0 G2 G1 G0 G2 G1} { B1 B0 B1 B0 B1 B0 0 0}
24bit RGB888 { R2 R1 R0 R2 R1 R0 R2 R1 }{ G2 G1 G0 G2 G1 G0 G2 G1 }{ B1 B0 B1 B0 B1 B0 B1 B0}
从如上转化可以看出,B分量进行了四轮补偿
进行这样的补偿,在做色彩格式转化的时候,能够明显的改善色彩效果,减少精度上的损失。
有时候,回过头来,会感谢自己,当初苦逼写的这些博客没白写!
记得之前玩过两周Arduino,调试出了,实时采集重力传感器的数据到贝壳物联显示,还好我及时做了一些笔记,以至于现在想用Arduino+FPGA做个项目的时候,很快就能上手调试了,所以,很感谢自己当时苦逼的写博客做笔记!