首页 > 其他分享 >FPGA设计经验之图像处理

FPGA设计经验之图像处理

时间:2024-02-08 14:00:58浏览次数:39  
标签:经验 运算 FPGA 像素 图像处理 图像 data

用FPGA做图像处理优势最关键的就是:FPGA能进行实时流水线运算,能达到最高的实时性。因此在一些对实时性要求非常高的应用领域,做图像处理基本就只能用FPGA。例如在一些分选设备中图像处理基本上用的都是FPGA,因为在其中相机从看到物料图像到给出执行指令之间的延时大概只有几毫秒,这就要求图像处理必须很快且延时固定,只有FPGA进行的实时流水线运算才能满足这一要求。

所以要了解FPGA进行图像处理的优势就必须理解FPGA所能进行的实时流水线运算和DSP,GPU等进行的图像处理运算有何不同。DSP,GPU,CPU对图像的处理基本是以帧为单位的,从相机采集的图像数据会先存在内存中,然后GPU会读取内存中的图像数据进行处理。假如采集图像的帧率是30帧,那么DSP,GPU要是能在1/30秒内完成一帧图像的处理,那基本上就能算是实时处理。

FPGA对图像进行实时流水线运算是以行为单位的。FPGA可以直接和图像传感器芯片连接获得图像数据流,如果是RAW格式的则还可以进行差值以获得RGB图像数据。FPGA能进行实时流水线处理的关键是它可以用其内部的Block Ram缓存若干行的图像数据。这个Block Ram可以说是类似于CPU里面的Cache,但Cache不是你能完全控制的,但Block Ram是完全可控的,可以用它实现各种灵活的运算处理。这样FPGA通过缓存若干行图像数据就可以对图像进行实时处理,数据就这样一边流过就一边处理好了,不需要送入DDR缓存了之后再读出来处理。

这样的数据流处理显然是顺序读取数据的,那么也就只能实现那些顺序读取数据的算法,也就是图像处理中那一大类用3x3到NxN的算子进行的滤波、取边缘、膨胀腐蚀等算法。可能大家会觉得这些运算似乎都是最基本的图像处理运算,只是个前端的预处理,似乎用处不大。但问题是只有FPGA做这样的运算才是速度最快效率最高的,比如用CPU做一个取边缘的算法根本就达不到实时。另外别小看了这种NxN算子法,它可以有各种组合和玩法,可以实现分选多种颜色,甚至分辨简单形状等功能。FPGA进行的这种算子法处理是并行流水线算法,其延时是固定的,比如用3x3的算子进行处理其给出结果的延时是两行图像的时间。还有这个算子法和现在卷积神经网络中最前面的卷积层运算是类似的。

FPGA中的Block Ram是重要和稀缺资源,能缓存的图像数据行数是有限的,所以这个NxN的算子中的N不能特别大。当然FPGA也可以接DDR把图像缓存到其中再读出来进行处理,但这种处理模式就和CPU差不多了,达不到最高的实时性。其实有些我们认为需要随机读取数据的图像处理算法也是可以并行流水线化的。

在密集运算中,耽误时间和消耗功耗的操作往往不是运算本身,而是把数据从内存中搬来搬去。GPU,CPU在进行运算时要把数据从内存中取出来,算好了在放回去。这样内存带宽往往成了运算速度的瓶颈,数据搬运过程中的功耗占的比重也不会小。FPGA则可以通过堆很多计算硬件的方法把要做的运算都展开,然后数据从中流过,完成一个阶段的运算之后就直接流入第二个阶段,不需要把一个计算阶段完成后的数据再送回内存中,再读出来交给下一个阶段的运算。这样就会节省很多时间和功耗。现在用FPGA做图像处理就是这样干的,比如先用一个3x3的算子进行滤波,再用一个3x3的算子进行取边缘,在FPGA流水线算法中,滤波处理完了数据立即就会进行取边缘处理,是不需要像CPU那样存回内存再读出来的。

FPGA进行图像处理的前景还是挺广阔的,越来越多的工业应用场合都要求更高的实时性,而这正是FPGA所适合的。还有机器学习领域,神经网络这种层状的,不需要很随机的读取数据的运算是比较适合用FPGA来做的。不过FPGA不擅长浮点运算,如果能整出不需要浮点运算的神经网络,那么FPGA在这方面的应用将会更大。

前些年用matlab和opencv做图像处理。近一段时间通过FPGA处理摄像头视频数据,有太多感触,复杂的算法先不提及,单是上面文章中提到的一些处理手段及策略,非常受用。

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=-rr I(x+i,y+j)) / (2r+1)2

数学公式很好理解,就是求一个窗口的所有像素灰度值之后后再除以整个窗口的面积也就是像素点个数,求出平均值;

均值滤波的方法将数据存储成3x3的矩阵,然后求这个矩阵。在图像上对目标像素给一个模板,

该模板包括了其周围的临近像素(以目标像素为中心的周围 8 个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

 

shift_ram 进行数据矩阵化,将3x3矩阵的中心像素的周围八个点求和,采取了流水线的设计方法,来增加吞吐量,然后再求平均值代替目标像素的值。

 

 包括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  ;
    
end
View Code

5.非线性滤波器

非线性滤波器通常下是没有特定的转移函数,统计排序滤波器;

中值滤波

 

第一步:将每一行按最大值、中间值、最小值排列;

第二步:提取出最大值的最小值,中间值的中间值,最小值的最大值;

第三步:将第二步提取出来的三个数进行排序,中间值即我们要求的中间值。

6.图像分割

图像分割是将图像划分成若干个互不相交的小区域的过程,将图像中有意义的特征或应用所需要的特征信息提取出来,最终结果是分割成一些具有某种特征的单元,称为图像的基元。

标签:经验,运算,FPGA,像素,图像处理,图像,data
From: https://www.cnblogs.com/shiningleo007/p/18011750

相关文章

  • 软件无线电平台的FPGA设计与实现
    软件无线电的概念最早由美国MITRE公司的Joe.Mitola于1992年5月在美国国家远程会议上提出,其基本思想是以硬件平台作为无线电通信的基础,通过软件编程的方式在此硬件平台上实现可定制的无线电功能。软件无线电系统具有数字化、可编程性、模块化、可扩展性和开放性的特点,使其在包......
  • FPGA图像处理学习(人脸识别、追踪、转换)
    获取人脸图像——肤色提取(Ycbcr+阈值)——滤波处理(中值、腐蚀膨胀)——人脸框选——显示肤色提取:顾名思义,将肤色从外界环境中提取出。在肤色识别算法中,常用YCbCr颜色空间(亮度、蓝色、红色分量),因为肤色在YCbCr空间受亮度信息的影响较小,从而肤色类聚性好,由此,在Ycbcr空间基础上,我们......
  • FPGA图像处理(直方图均衡化)
       图像处理领域中利用图像直方图对对比度进行调整的方法。对比度是画面黑与白的比值,也就是从黑到白的渐变层次。比值越大,从黑到白的渐变层次就越多,从而色彩表现越丰富。对比度对视觉效果的影响非常关键,一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度小,则会让......
  • 学编程千万别上培训机构:费用、通用性和实战经验都不行
    学编程是一项极富挑战性的任务,而不是一件能够轻松完成的事情。很多人在学习编程的时候都会考虑去培训机构学习,然而,在现实中,并不是每个人都能从培训机构中获得真正的技术提升,相反,有许多学习编程的人,尤其是想从事IT行业的人,其实更适合采用其他的学习方式。以下是一些理有据的观点,用来......
  • 高级FPGA开发之基础协议之PCIe(二)
    高级FPGA开发之基础协议之PCIe(二)一、TLP报文类型在PCIe总线中,存储器读写、I/O读写和配置读写请求TLP主要由以下几类报文组成:1.1存储器读请求TLP和读完成TLP当PCIe主设备(RC或者EP)访问目标设备的存储器空间时,使用non-posted总线事务向目标设备发出存储器读请求TLP,目标设备收到这个存......
  • 博主项目经验-至2024
    讯飞内部vue2+vue3后管开发项目集合。一.讯飞医疗,AI能力演示平台,vue2项目。项目技术栈:Vue2+elementui+vuex+vue-router优化项目代码,包括axios二次封装,使用axios拦截器,统一报错处理,登录校验等等。使用Nginx转发翻译服务,声纹识别,自然语言理解服务。语音识别使用websocket完成......
  • 全国产T3+FPGA的SPI与I2C通信方案分享
    近年来,随着中国新基建、中国制造2025规划的持续推进,单ARM处理器越来越难胜任工业现场的功能要求,特别是如今能源电力、工业控制、智慧医疗等行业,往往更需要ARM+FPGA架构的处理器平台来实现例如多路/高速AD采集、多路网口、多路串口、多路/高速并行DI/DO、高速数据并行处理等特定......
  • [经验] 对未来的规划800字作文
    1、对未来的规划对未来的规划是每个人必须思考的问题。未来不仅仅是一段时间,更是我们努力的目标和方向。规划好未来,才能有所依照,不至于迷失自我。首先,我们应该认真思考自己的职业规划,包括职业方向、职业技能以及未来发展方向。分析自身优劣势,结合未来市场需求和潜力,选择符合自己兴......
  • [经验] 哪些马桶入选了十大排名
    马桶,是人们日常生活中不可或缺的物品之一。随着时代的发展,马桶的种类也越来越多样化,不同的材质、功能、样式、品牌不同,马桶的使用感受也各异。在这样一个繁琐的挑选过程中,了解马桶的排名和性能表现是非常重要的。马桶的性能表现关系到每个人的舒适感。为此,我们特意整理出了“马桶十......
  • [经验] 护照过期签证没过期怎么办 美国
    1、护照过期签证没过期怎么办护照过期签证未过期的情况在出国旅行中时有发生。这时候,应该如何处理呢?应该明确的是,护照过期可能无法通过海关,签证未过期也不能派上用场。如果旅行还有一段时间,建议尽快申请新的护照。通常情况下,申请新的护照需要一段时间,包括填写表格,获取照片和支付费......