改善OV5640的锯齿现象(应用梯度导向算法)
来源:互联网 发布:图片怎么上传淘宝店铺 编辑:程序博客网 时间:2024/06/01 09:09
关于梯度导向算法的内容来自于http://blog.chinaaet.com/crazybingo/p/32548
来看bayer pattern,其中的一部分示意图如下:
因为人眼对绿色分量最为敏感,因此G分量占的比重大,为像素总数的一半;像素总数的四分之一为R,四分之一为B。将Bayer Raw图像转换为RGB图像,本系统尝试过两种算法:1.双线性插值法。2.边缘导向算法。双线性插值法就是使用周围邻域像素来恢复自身像素值的办法,
以R在中间,四边G,四角B的排列为例,其中,像素的下标为坐标。
对于(2,2)点像素,R为R22,G为(G12+G21+G23+G32)/4,B为(B11+B13+B31+B33)/4
双线性插值算法实现简单,并且适合用FPGA流水线方式进行操作,在平滑的区域有比较好的实现效果,但是在图像的轮廓区域,由于像素的取值并没有考虑到方向性,采用双线性插值算法,将产生锯齿状的效应,大大影响图像质量。
为了克服双线性插值算法带来的图像轮廓的锯齿效应,本系统考虑到第二种算法:边缘导向插值算法。这种插值算法通过比较水平方向、垂直方向和对角线方向的梯度大小,选择梯度较小方向上的像素点,来计算当前像素值。仍然以R在中间,四边G,四角B的排列为例:
因为边缘导向插值算法考虑到了图像边缘区域的变化,因此可以避免边缘区域的锯齿现象。本系统通过对比两种算法,在资源足够的情况下,采用了效果更好的边缘导向插值算法。
将RAW2RGB的源码粘贴如下:
moduleRAW2RGB(iCLK,iRST_N,//Read Port 1iDATA,iDVAL,oRed,oGreen,oBlue,oDVAL,iZoom,iX_Cont,iY_Cont);//--------------------------------------------------//parameterDATA_SIZE=10;inputiCLK,iRST_N;input[DATA_SIZE-1:0]iDATA;inputiDVAL;output[DATA_SIZE-1:0]oRed;output[DATA_SIZE-1:0]oGreen;output[DATA_SIZE-1:0]oBlue;outputoDVAL;input[1:0]iZoom;input[15:0]iX_Cont;input[15:0]iY_Cont;wire[DATA_SIZE-1:0]wData0;wire[DATA_SIZE-1:0]wData1;wire[DATA_SIZE-1:0]wData2;reg[DATA_SIZE-1:0]rRed;reg[DATA_SIZE-1:0]rGreen;reg[DATA_SIZE-1:0]rBlue;regrDval;reg[DATA_SIZE-1:0]wData0_d1,wData0_d2;reg[DATA_SIZE-1:0]wData1_d1,wData1_d2;reg[DATA_SIZE-1:0]wData2_d1,wData2_d2;regoDVAL;regdval_ctrl;regdval_ctrl_en;//outassignoRed=rRed;assignoGreen=rGreen;assignoBlue=rBlue;LineBuffer_vhdlL1(.clken(iDVAL),.aclr(~iRST_N),.clock(iCLK),.shiftin(iDATA),.shiftout(),.taps({wData2,wData1,wData0}));always@(posedge iCLK or negedge iRST_N)beginif (!iRST_N)begindval_ctrl<=0;endelsebeginif(iY_Cont>1)begindval_ctrl<=1;endelsebegindval_ctrl<=0;endendendalways@(posedge dval_ctrl or negedge iRST_N)beginif (!iRST_N)begindval_ctrl_en<=0;endelsebegindval_ctrl_en<=1;endendalways@(posedge iCLK or negedge iRST_N)beginif (!iRST_N)beginrDval<=0;oDVAL <= 0;endelseif(dval_ctrl_en)beginrDval<=iDVAL;oDVAL<=rDval;endelsebeginrDval<=iDVAL;oDVAL<=0;endendalways@(posedge iCLK or negedge iRST_N)beginif (!iRST_N)beginwData0_d1<=0;wData0_d2<=0;wData1_d1<=0;wData1_d2<=0;wData2_d1<=0;wData2_d2<=0;endelsebegin{wData0_d2,wData0_d1}<={wData0_d1,wData0};{wData1_d2,wData1_d1}<={wData1_d1,wData1};{wData2_d2,wData2_d1}<={wData2_d1,wData2};endendalways@(posedge iCLK or negedge iRST_N)beginif (!iRST_N)beginrRed<=0;rGreen<=0;rBlue<=0;endelse if ({iY_Cont[0],iX_Cont[0]} == 2'b00)//2'b11begin rRed<=wData1_d1; //Hg > Vg if( (wData1_d2 >= wData1 && wData2_d1 >= wData0_d1 && (wData1_d2- wData1)>(wData2_d1-wData0_d1) )|| ( wData1_d2 >= wData1 && wData2_d1 < wData0_d1 && (wData1_d2 - wData1)>(wData0_d1 - wData2_d1) ) || ( wData1_d2 < wData1 && wData2_d1 >= wData0_d1 && (wData1 - wData1_d2)>(wData2_d1 - wData0_d1) ) || ( wData1_d2 < wData1 && wData2_d1 < wData0_d1 && (wData1 - wData1_d2)>(wData0_d1 - wData2_d1) ) ) rGreen<=(wData2_d1+ wData0_d1)/2; //Hg < Vg if( (wData1_d2 >= wData1 && wData2_d1 >= wData0_d1 && (wData1_d2- wData1)<(wData2_d1-wData0_d1) )|| ( wData1_d2 >= wData1 && wData2_d1 < wData0_d1 && (wData1_d2 - wData1)<(wData0_d1 - wData2_d1) ) || ( wData1_d2 < wData1 && wData2_d1 >= wData0_d1 && (wData1 - wData1_d2)<(wData2_d1 - wData0_d1) ) || ( wData1_d2 < wData1 && wData2_d1 < wData0_d1 && (wData1 - wData1_d2)<(wData0_d1 - wData2_d1) ) ) rGreen<=(wData1_d2+ wData1)/2; //Hg = Vg if( (wData1_d2 >= wData1 && wData2_d1 >= wData0_d1 && (wData1_d2- wData1)==(wData2_d1-wData0_d1) )|| ( wData1_d2 >= wData1 && wData2_d1 < wData0_d1 && (wData1_d2 - wData1)==(wData0_d1 - wData2_d1) ) || ( wData1_d2 < wData1 && wData2_d1 >= wData0_d1 && (wData1 - wData1_d2)==(wData2_d1 - wData0_d1) ) || ( wData1_d2 < wData1 && wData2_d1 < wData0_d1 && (wData1 - wData1_d2)==(wData0_d1 - wData2_d1) ) ) rGreen<=(wData1+wData2_d1+wData1_d2 + wData0_d1)/4; //Db1 > Db2 if( (wData2_d2 >= wData0 && wData2 >= wData0_d2 && (wData2_d2- wData0)>(wData2-wData0_d2) )|| (wData2_d2 >= wData0 && wData2 < wData0_d2 && (wData2_d2- wData0)>(wData0_d2 - wData2) )|| (wData2_d2 < wData0 && wData2 >= wData0_d2 && (wData0 - wData2_d2)>(wData2-wData0_d2) )|| (wData2_d2 < wData0 && wData2 < wData0_d2 && (wData0 - wData2_d2)>(wData0_d2 - wData2) ) ) rBlue<=(wData2+wData0_d2)/2; //Db1 < Db2 if( (wData2_d2 >= wData0 && wData2 >= wData0_d2 && (wData2_d2- wData0)<(wData2-wData0_d2) )|| (wData2_d2 >= wData0 && wData2 < wData0_d2 && (wData2_d2- wData0)<(wData0_d2 - wData2) )|| (wData2_d2 < wData0 && wData2 >= wData0_d2 && (wData0 - wData2_d2)<(wData2-wData0_d2) )|| (wData2_d2 < wData0 && wData2 < wData0_d2 && (wData0 - wData2_d2)<(wData0_d2 - wData2) ) ) rBlue<=(wData2_d2+wData0)/2; //Db1 = Db2 if( (wData2_d2 >= wData0 && wData2 >= wData0_d2 && (wData2_d2- wData0)==(wData2-wData0_d2) )|| (wData2_d2 >= wData0 && wData2 < wData0_d2 && (wData2_d2- wData0)==(wData0_d2 - wData2) )|| (wData2_d2 < wData0 && wData2 >= wData0_d2 && (wData0 - wData2_d2)==(wData2-wData0_d2) )|| (wData2_d2 < wData0 && wData2 < wData0_d2 && (wData0 - wData2_d2)==(wData0_d2 - wData2) ) ) rBlue<=(wData0+wData2+wData0_d2 + wData2_d2)/4; endelse if ({iY_Cont[0],iX_Cont[0]} == 2'b01)//2'b10begin rRed<=(wData1+wData1_d2)/2; rGreen<=(wData0+wData2+wData0_d2 + wData2_d2)/4; rBlue<=(wData0_d1+wData2_d1)/2; endelse if ({iY_Cont[0],iX_Cont[0]} == 2'b10)//2'b01begin rRed<=(wData2_d1+wData0_d1)/2; rGreen<=(wData0+wData2+wData0_d2 + wData2_d2)/4; rBlue<=(wData1+wData1_d2)/2;endelse if ({iY_Cont[0],iX_Cont[0]} == 2'b11)//2'b00beginrBlue<=wData1_d1; //Hg > Vg if( (wData1_d2 >= wData1 && wData2_d1 >= wData0_d1 && (wData1_d2- wData1)>(wData2_d1-wData0_d1) )|| ( wData1_d2 >= wData1 && wData2_d1 < wData0_d1 && (wData1_d2 - wData1)>(wData0_d1 - wData2_d1) ) || ( wData1_d2 < wData1 && wData2_d1 >= wData0_d1 && (wData1 - wData1_d2)>(wData2_d1 - wData0_d1) ) || ( wData1_d2 < wData1 && wData2_d1 < wData0_d1 && (wData1 - wData1_d2)>(wData0_d1 - wData2_d1) ) ) rGreen<=(wData2_d1+ wData0_d1)/2; //Hg < Vg if( (wData1_d2 >= wData1 && wData2_d1 >= wData0_d1 && (wData1_d2- wData1)<(wData2_d1-wData0_d1) )|| ( wData1_d2 >= wData1 && wData2_d1 < wData0_d1 && (wData1_d2 - wData1)<(wData0_d1 - wData2_d1) ) || ( wData1_d2 < wData1 && wData2_d1 >= wData0_d1 && (wData1 - wData1_d2)<(wData2_d1 - wData0_d1) ) || ( wData1_d2 < wData1 && wData2_d1 < wData0_d1 && (wData1 - wData1_d2)<(wData0_d1 - wData2_d1) ) ) rGreen<=(wData1_d2+ wData1)/2; //Hg = Vg if( (wData1_d2 >= wData1 && wData2_d1 >= wData0_d1 && (wData1_d2- wData1)==(wData2_d1-wData0_d1) )|| ( wData1_d2 >= wData1 && wData2_d1 < wData0_d1 && (wData1_d2 - wData1)==(wData0_d1 - wData2_d1) ) || ( wData1_d2 < wData1 && wData2_d1 >= wData0_d1 && (wData1 - wData1_d2)==(wData2_d1 - wData0_d1) ) || ( wData1_d2 < wData1 && wData2_d1 < wData0_d1 && (wData1 - wData1_d2)==(wData0_d1 - wData2_d1) ) ) rGreen<=(wData1+wData2_d1+wData1_d2 + wData0_d1)/4; //Db1 > Db2 if( (wData2_d2 >= wData0 && wData2 >= wData0_d2 && (wData2_d2- wData0)>(wData2-wData0_d2) )|| (wData2_d2 >= wData0 && wData2 < wData0_d2 && (wData2_d2- wData0)>(wData0_d2 - wData2) )|| (wData2_d2 < wData0 && wData2 >= wData0_d2 && (wData0 - wData2_d2)>(wData2-wData0_d2) )|| (wData2_d2 < wData0 && wData2 < wData0_d2 && (wData0 - wData2_d2)>(wData0_d2 - wData2) ) ) rRed<=(wData2+wData0_d2)/2; //Db1 < Db2 if( (wData2_d2 >= wData0 && wData2 >= wData0_d2 && (wData2_d2- wData0)<(wData2-wData0_d2) )|| (wData2_d2 >= wData0 && wData2 < wData0_d2 && (wData2_d2- wData0)<(wData0_d2 - wData2) )|| (wData2_d2 < wData0 && wData2 >= wData0_d2 && (wData0 - wData2_d2)<(wData2-wData0_d2) )|| (wData2_d2 < wData0 && wData2 < wData0_d2 && (wData0 - wData2_d2)<(wData0_d2 - wData2) ) ) rRed<=(wData2_d2+wData0)/2; //Db1 = Db2 if( (wData2_d2 >= wData0 && wData2 >= wData0_d2 && (wData2_d2- wData0)==(wData2-wData0_d2) )|| (wData2_d2 >= wData0 && wData2 < wData0_d2 && (wData2_d2- wData0)==(wData0_d2 - wData2) )|| (wData2_d2 < wData0 && wData2 >= wData0_d2 && (wData0 - wData2_d2)==(wData2-wData0_d2) )|| (wData2_d2 < wData0 && wData2 < wData0_d2 && (wData0 - wData2_d2)==(wData0_d2 - wData2) ) ) rRed<=(wData0+wData2+wData0_d2 + wData2_d2)/4; endendendmodule
1 0
- 改善OV5640的锯齿现象(应用梯度导向算法)
- 梯度寻优解释(包括Rosenbrock function寻优路线投影出现锯齿的原因)
- 导向滤波小结:从导向滤波(guided filter)到快速导向滤波(fast guide filter)的原理,应用及opencv实现代码
- 导向滤波小结:从导向滤波(guided filter)到快速导向滤波(fast guide filter)的原理,应用及opencv实现代码
- 机器学习(六)梯度下降的优化算法和matlab/octave中的应用
- 用户体验导向的Android应用开发
- 用户体验导向的Android应用开发
- 导向滤波磨皮 算法的实现
- 调通sina33m下的OV5640(分色排版)
- BP算法的梯度激增,梯度消失
- 时间序列算法的改善
- 机器学习-梯度下降IV(多维度的梯度下降算法的定义)
- 梯度下降算法的实质
- 不同的梯度下降算法
- 转梯度算法的理解
- 梯度下降的算法笔记
- [DeeplearningAI笔记]改善深层神经网络_优化算法2.1_2.2_mini-batch梯度下降法
- 共轭梯度(CG)算法
- 我的python第一天:爬虫+界面+发邮件
- Java开发者值得关注的7款工具
- js-01
- 使用WebRTC搭建前端视频聊天室——数据通道篇
- Synonym
- 改善OV5640的锯齿现象(应用梯度导向算法)
- Android 自用各种插件
- 你真的知道Java中boolean类型占用多少个字节吗?
- Shell命令行下如何查找并替换多个文件中的字符
- PDF格式文件的浏览与编辑
- JVM内存分析
- 【教程】Win32 WNDCLASS窗口类中的额外空间cbClsExtra和cbWndExtra的用法
- 一个超炫的listview
- ubuntu下查找含有某关键字内容的文件(cp:http://www.2cto.com/os/201401/274076.html)