图像处理系统设计注意点:1.将算法开发和FPGA实现分离用软件的图像处理环境可以使用大批量的图像样本进行测试及调试算法,再将算法映射到硬件上,这样大大节省了硬件调试周期。2.算法的精度图像处理的算法中,大部分需要采用浮点数运算,而浮点数运算再FPGA中是非常不划算的,因此需要转换成定点数计算,此时会设计到浮点运算转定点运算时精度下降的问题。3.软件和硬件的合理划分这里的软件是指DSP,CPU,硬件是指FPGA;一般结构规则计算量大的操作如sobel算子均值滤波可以采用硬件进行,不规则的动态可变长度循环的底层算法由软件进行;
图像处理FPGA 设计基本方法:1.阵列结构结合流水线处理设计例如RGB图像,包括三组数据,处理时需要并行三通道后,每个通道进行分别的串行流水处理。2.缓存设计帧缓存行缓存列对齐3.资源分辨率处理窗口对资源影响成倍增加基于FPGA设计框架举例:1、灰度直方图统计直方图是图像的灰度分布统计的一种表示方法,统计目标图像中各个灰度点的像素个数,很多对于图像的调整算法都是基于此进行的;如何基于FPGA进行统计呢?1)由于是统计图像的直方图,所以一定是统计结果会在图像经过之后才能产生,因此需要进行缓存;缓存一:统计后的结果;缓存二:经过统计处理器的图像数据,以便后面和直方图做同步处理。2)图像常常用8位、24位、32位来表示一个像素的灰度值, 因此,统计种类分别为2^8=256/2^24=16777216/2^32=4294967296,地址位宽根据此进行选择设定;根据不同的精度选择不同的缓存方式:片内或片外缓存;3)处理流程: 首先根据当前来的灰度值做为读RAM地址,读出RAM中对应灰度值的的统计值;第二将读出结果加一并回写回RAM的当前地址中;第三重复操作至当前图像处理结束;第四下一幅图像到来之前顺序按灰度值从0到最大的顺序将最终结果读出;第五读出最终结果后,将RAM清空。4)处理细节定义参数图像高度IH 图像宽度IW像素逐行输入因此以行同步脉冲的上升沿作为统计开始,行同步脉冲作为行统计计数器 行统计计数器达到最大高度时,作为统计结束标志。2.灰度直方图均衡化处理1.统计出直方图,获取各个像素灰度累加和2.乘以均衡系数:(2^DW-1)/IW*IH(像素最大值/图像的面积)
3.直方图线性拉伸处理 此节暂时略过;4.线性滤波器首先需要区分线性和非线性滤波器的区别,区别在于其输出与输入之间是否有唯一且确定的函数传递。线性滤波器分类:平滑滤波器:主要包括均值滤波器和高斯滤波器等锐化滤波器:主要包括SOBEL算子 LAPLAS算子梯度运算等滤波器的物理意义主要是响应信号对目标信号响应后的样子,也就是响应函数g(i,j)滑过整个图像,即对图像做一个卷积处理,就得到了滤波结果。 1)均值滤波器概述用一个图像区域的各个像素的平均值来代替原图像的各个像素值,主要作用是减小锐度,减小噪声。 均值滤波一般出现在图像处理的预处理步骤, 预处理后,根据噪声来源,例如针对椒盐噪声做中值滤波处理,针对高斯噪声做高斯滤波处理后续可能继续做边缘提取等复杂操作处理。 2)均值滤波器设计设计一个滤波器可以理解成设计一个响应函数g(x,y)=Σi=-rrΣj=-rrI(x+i,y+j)) / (2r+1)2数学公式很好理解,就是求一个窗口的所有像素灰度值之后后再除以整个窗口的面积也就是像素点个数,求出平均值; 均值滤波的方法将数据存储成3x3的矩阵,然后求这个矩阵。在图像上对目标像素给一个模板, 该模板包括了其周围的临近像素(以目标象素为中心的周围 8 个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
(参考:http://www.cnblogs.com/ninghechuan/p/6789399.html) (参考:http://www.cnblogs.com/aslmer/p/5779079.html#undefined) shift_ram 进行数据矩阵化,将3x3矩阵的中心像素的周围八个点求和,采取了流水线的设计方法,来增加吞吐量,然后再求平均值代替目标像素的值。
Gx= | -2 0 +2 |
| -1 0 +1 |
| -1 -2 -1 |
Gy= | 0 0 0 |
| +1 +2 +1 |包括X和Y两个方向的两套3X3矩阵,使其分别和图像的X和Y方向进行卷积计算(矩阵的卷积计算即将所有元素做乘加计算);两个方向的卷积结果求平方根计算;计算结果如果大于阈值则等于0xffff,如果小于阈值则等于0;最终输出则是图像的边缘。参考代码如下:由于算子简单以及有正负区分,因此需要做正值和负值分别计算后再进行相减计算。 // | -1 0 +1 | //Gx= | -2 0 +2 | // | -1 0 +1 | // // | -1 -2 -1 | //Gy= | 0 0 0 | // | +1 +2 +1 | reg [8:0] p_x_data ,p_y_data ; // x 和 y 的正值之和 reg [8:0] n_x_data ,n_y_data ; // x 和 y 的负值之和 reg [8:0] gx_data ,gy_data ; //最终结果 always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin p_x_data <=0; n_x_data <=0; gx_data <=0; end else if(per_href_ff1==1) begin p_x_data <= p_13 + (p_23<<1) + p_33 ; n_x_data <= p_11 + (p_12<<1 )+ p_13 ; gx_data <= (p_x_data >=n_x_data)? p_x_data - n_x_data : n_x_data - p_x_data ; end else begin p_x_data<=0; n_x_data<=0; gx_data <=0; end end always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin p_y_data <=0; n_y_data <=0; gy_data <=0; end else if(per_href_ff1==1) begin p_y_data <= p_11 + (p_12<<1) + p_13 ; n_y_data <= p_31 + (p_32<<1) + p_33 ; gy_data <= (p_y_data >=n_y_data)? p_y_data - n_y_data : n_y_data - p_y_data ; end else begin p_y_data <=0; n_y_data <=0; gy_data <=0; end end //求平方和,调用ip核开平方 reg [16:0] gxy; // Gx 与 Gy 的平方和 always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin gxy<=0; end else begin gxy<= gy_data* gy_data + gx_data* gx_data ; end end wire [8:0] squart_out ; altsquart u1_altsquart ( //例化开平方的ip核 .radical (gxy), .q (squart_out), //输出的结果 .remainder() ); //与阈值进行比较 reg [15:0] post_y_data_r; always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin post_y_data_r<=16'h00; end else if(squart_out>=threshold) post_y_data_r<=16'h00 ; else post_y_data_r<=16'hffff ; endView Code5.非线性滤波器非线性滤波器通常下是没有特定的转移函数,统计排序滤波器;
第一步:将每一行按最大值、中间值、最小值排列 第二步:提取出最大值的最小值,中间值的中间值,最小值的最大值 第三步:将第二步提取出来的三个数进行排序,中间值即我们要求的中间值。 6.图像分割图像分割是将图像划分成若干个互不相交的小区域的过程,将图像中有意义的特征或应用所需要的特征信息提取出来,最终结果是分割成一些具有 某种特征的单元,称为图像的基元。
图像处理FPGA 设计基本方法:1.阵列结构结合流水线处理设计例如RGB图像,包括三组数据,处理时需要并行三通道后,每个通道进行分别的串行流水处理。2.缓存设计帧缓存行缓存列对齐3.资源分辨率处理窗口对资源影响成倍增加基于FPGA设计框架举例:1、灰度直方图统计直方图是图像的灰度分布统计的一种表示方法,统计目标图像中各个灰度点的像素个数,很多对于图像的调整算法都是基于此进行的;如何基于FPGA进行统计呢?1)由于是统计图像的直方图,所以一定是统计结果会在图像经过之后才能产生,因此需要进行缓存;缓存一:统计后的结果;缓存二:经过统计处理器的图像数据,以便后面和直方图做同步处理。2)图像常常用8位、24位、32位来表示一个像素的灰度值, 因此,统计种类分别为2^8=256/2^24=16777216/2^32=4294967296,地址位宽根据此进行选择设定;根据不同的精度选择不同的缓存方式:片内或片外缓存;3)处理流程: 首先根据当前来的灰度值做为读RAM地址,读出RAM中对应灰度值的的统计值;第二将读出结果加一并回写回RAM的当前地址中;第三重复操作至当前图像处理结束;第四下一幅图像到来之前顺序按灰度值从0到最大的顺序将最终结果读出;第五读出最终结果后,将RAM清空。4)处理细节定义参数图像高度IH 图像宽度IW像素逐行输入因此以行同步脉冲的上升沿作为统计开始,行同步脉冲作为行统计计数器 行统计计数器达到最大高度时,作为统计结束标志。2.灰度直方图均衡化处理1.统计出直方图,获取各个像素灰度累加和2.乘以均衡系数:(2^DW-1)/IW*IH(像素最大值/图像的面积)



1 //矩阵元素移位赋值 2 always @(posedge clk or negedge rst_n)begin 3 if(rst_n==1'b0)begin 4 {p_11,p_12,p_13} <= {5'b0,5'b0,5'b0} ; 5 {p_21,p_22,p_23} <= {15'b0,15'b0,15'b0}; 6 {p_31,p_32,p_33} <= {15'b0,15'b0,15'b0}; 7 end 8 else begin 9 if(per_href_ff0==1&&flag_do==1)begin 10 {p_11,p_12,p_13}<={p_12,p_13,row_1}; 11 {p_21,p_22,p_23}<={p_22,p_23,row_2}; 12 {p_31,p_32,p_33}<={p_32,p_33,row_3}; 13 end 14 else begin 15 {p_11,p_12,p_13}<={5'b0,5'b0,5'b0}; 16 {p_21,p_22,p_23}<={5'b0,5'b0,5'b0} 17 {p_31,p_32,p_33}<={5'b0,5'b0,5'b0} 18 end 19 end 20 end 21 22 23 always @(posedge clk or negedge rst_n)begin 24 if(rst_n==1'b0)begin 25 mean_value_add1<=0; 26 mean_value_add2<=0; 27 mean_value_add3<=0; 28 end 29 else if(per_href_ff1)begin 30 mean_value_add1<=p_11+p_12+p_13; 31 mean_value_add2<=p_21+ 0 +p_23; 32 mean_value_add3<=p_31+p_32+p_33; 33 end 34 end 35 36 wire [8:0]mean_value;//8位数之和 37 wire [5:0]fin_y_data; //平均数,除以8,相当于左移三位。 38 39 assign mean_value=mean_value_add1+mean_value_add2+mean_value_add3; 40 assign fin_y_data=mean_value[8:3];View Code 3)sobel算子 | -1 0 +1 |
Gx= | -2 0 +2 |
| -1 0 +1 |
| -1 -2 -1 |
Gy= | 0 0 0 |
| +1 +2 +1 |包括X和Y两个方向的两套3X3矩阵,使其分别和图像的X和Y方向进行卷积计算(矩阵的卷积计算即将所有元素做乘加计算);两个方向的卷积结果求平方根计算;计算结果如果大于阈值则等于0xffff,如果小于阈值则等于0;最终输出则是图像的边缘。参考代码如下:由于算子简单以及有正负区分,因此需要做正值和负值分别计算后再进行相减计算。 // | -1 0 +1 | //Gx= | -2 0 +2 | // | -1 0 +1 | // // | -1 -2 -1 | //Gy= | 0 0 0 | // | +1 +2 +1 | reg [8:0] p_x_data ,p_y_data ; // x 和 y 的正值之和 reg [8:0] n_x_data ,n_y_data ; // x 和 y 的负值之和 reg [8:0] gx_data ,gy_data ; //最终结果 always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin p_x_data <=0; n_x_data <=0; gx_data <=0; end else if(per_href_ff1==1) begin p_x_data <= p_13 + (p_23<<1) + p_33 ; n_x_data <= p_11 + (p_12<<1 )+ p_13 ; gx_data <= (p_x_data >=n_x_data)? p_x_data - n_x_data : n_x_data - p_x_data ; end else begin p_x_data<=0; n_x_data<=0; gx_data <=0; end end always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin p_y_data <=0; n_y_data <=0; gy_data <=0; end else if(per_href_ff1==1) begin p_y_data <= p_11 + (p_12<<1) + p_13 ; n_y_data <= p_31 + (p_32<<1) + p_33 ; gy_data <= (p_y_data >=n_y_data)? p_y_data - n_y_data : n_y_data - p_y_data ; end else begin p_y_data <=0; n_y_data <=0; gy_data <=0; end end //求平方和,调用ip核开平方 reg [16:0] gxy; // Gx 与 Gy 的平方和 always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin gxy<=0; end else begin gxy<= gy_data* gy_data + gx_data* gx_data ; end end wire [8:0] squart_out ; altsquart u1_altsquart ( //例化开平方的ip核 .radical (gxy), .q (squart_out), //输出的结果 .remainder() ); //与阈值进行比较 reg [15:0] post_y_data_r; always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin post_y_data_r<=16'h00; end else if(squart_out>=threshold) post_y_data_r<=16'h00 ; else post_y_data_r<=16'hffff ; endView Code5.非线性滤波器非线性滤波器通常下是没有特定的转移函数,统计排序滤波器;
中值滤波
将 3*3 滑动块中的灰度值进行排序,然后用排序的中间值取代 3*3 滑块中心的值。示意图如下图所示。
审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
FPGA
+关注
关注
1638文章
21853浏览量
609245 -
图像分割
+关注
关注
4文章
182浏览量
18102
发布评论请先 登录
相关推荐

FPGA图像处理初学者的迷茫
哪位大神现在在从事基于FPGA图像处理的相关工作,我现在在学习,导师给选的方向,自己前一段时间用FPGA实现了中值滤波,sobel边缘检测,然后就是一些书本上面简单算法的实现 ,感觉高
发表于 06-29 20:38
FPGA图像处理基板的逻辑功能
1.FPGA功能设计上图所示的是FPGA图像处理基板的逻辑功能框图,图中左侧是背板接头,FPGA与背板接头相连的信号主要包括8路3.125G
发表于 11-10 08:06
基于FPGA的图像处理及自动调控电路的设计
设计了一种基于现场可编程门阵列(FPGA)EP3C25F25617 的图像处理及自动调控电路。该电路主要完成可见光图像的直方图均衡、中值滤波、十字叉叠加、快速自动调焦等
发表于 11-06 15:36
•9次下载

略谈FPGA图像处理
FPGA图像处理之路,从此开始,接下来,让我们把时间交给“图像处理”。一休哥在动笔之前,一直在犹豫,反复思考着一个问题,这个问题一直困扰着我
发表于 05-09 17:05
•4239次阅读
FPGA图像处理算法有哪些
早之前的朋友知道我发过一个用chatgpt分析出来的 FPGA图像处理的知识树,里面包含了从色域,镜头,接口和算法。然后我就发现这个算法部分chatgpt 给我整理的比较乱,查询了一番,确实发现

评论