FPGA形态学滤波设计

文章目录

    • 顶层框架设计
    • 子模块设计
      • 比较子模块(min_max)设计
      • 一维形态学腐蚀/膨胀子模块(morph_1d)设计
      • 二维形态学腐蚀/膨胀子模块(morph_2d)设计
      • 二维形态学开运算子模块(morph_open_2d)设计
      • 二维形态学Tophat变换模块(morph_tophat_2d)设计
    • 调试
      • 腐蚀效果图
      • 膨胀效果图
      • 开运算效果图
      • tophat变换效果图
    • 福利

顶层框架设计

Tophat变换(白帽)实际上是原图像与“开运算”的结果图之差,算法数学表达式如下:
在这里插入图片描述
根据以上公式,设计系统顶层框图如下所示:
FPGA形态学滤波设计_第1张图片
开运算为先腐蚀后膨胀的过程,将原图输入流依次流过腐蚀运算流水线和膨胀运算流水线即可,不过要注意时序对齐!!!,开运算的设计框图如下所示:
在这里插入图片描述
腐蚀与膨胀运算可以理解为在形态学处理核(n*n的矩形窗口)范围内寻找像素灰度值的最小值或最大值。他们之间只有些许差别,因此在设计时,将一维的腐蚀和膨胀操作划分为一个模块,通过入口参数(ERO_DIL)进行腐蚀或膨胀选择。二维腐蚀与膨胀操作的设计框图如下图所示:
FPGA形态学滤波设计_第2张图片
一维膨胀与腐蚀模块完成输入数据流的连续几个数据的比较,完成流水线输出。设计框图如下所示:
FPGA形态学滤波设计_第3张图片

子模块设计

在子模块设计中我们往往采用自底向上的设计原则。根据上一节所设计的整体框架及模块划分,我们需设计以下模块:
(1) 比较子模块min_max.v
(2) 一维形态学腐蚀/膨胀子模块morph_1d.v
(3) 二维形态学腐蚀/膨胀子模块morph_2d.v
(4) 二维形态学开运算子模块morph_open_2d.v
(5) 二维形态学Tophat运算模块morph_tophat_2d.v

比较子模块(min_max)设计

考虑到代码维护性和移植性,将基本比较单元设计为单独的子模块,这个子模块需实现以下功能:
(1) 输出两个数据的较大值
(2) 输出两个数据的较小值
模块的设计结构如下所示:
FPGA形态学滤波设计_第4张图片
由上图可以看出,本模块消耗一个时钟。

一维形态学腐蚀/膨胀子模块(morph_1d)设计

对于图像处理而言,可以分为纵向和横向两个维度的处理。我们习惯先处理横向处理,然后再纵向处理。所谓横向处理就是对每一行进行处理。对于nn的处理窗口,可以采用一个1n的窗口从图像第一行第一列开始,自左向右滑动,依次取出窗口内的n个像素灰度值,比较得到灰度最小值和最大值。

以处理尺寸为5来说明,其电路设计框图如下所示:
FPGA形态学滤波设计_第5张图片
上图中min_max的比较单元正好为一个时钟的开销。所以得到窗口内的最值需要5个时钟开销,同时考虑到边界对齐,将输出有效信号减少radius时钟。得到的输出有效信号与输出数据的关系图如下所示:
FPGA形态学滤波设计_第6张图片
容易算出,输入数据流经过morph_1d模块,共延时了KSZ-radius时钟。具体的看代码自己仔细算算。

二维形态学腐蚀/膨胀子模块(morph_2d)设计

将每一行的输入数据流过morph_1d模块,得到的结果即为每一行的一维运算结果。按照二维扩展的思路,将每一行的一维算子的计算结果对齐,然后在列方向上再进行一维运算,得到的结果即是二维运算结果。其框图如下所示:
FPGA形态学滤波设计_第7张图片
从上图可以看出,首先将din数据流入morph_1d模块,得到一维运算结果,然后再将其通过line_fifo行FIFO缓存起来,用于列数据对齐。

容易得知,缓存4行数据后,在第5行数据来的时候,该模块才能输出实际第3行的处理结果。当最后一行数据来的时候,该模块输出实际倒数第3行的结果。 此时各fifo中都还有一行的残留数据,所以需用利用场同步信号来进行行fifo清零,否则第二帧图像处理时会出问题。

同时为了使输出图像数据分辨率不变,就需要考虑边界问题。以line_rden[3]打3拍得到的输出有效标志信号,其对应的输出输出数据是第3行到倒数第3行,上下还有2行边界没有覆盖到。

考虑到morph_1d模块的morph_1d_dout_vld信号与line_rden[3]之间恰好存在2*radius行延时,正好用来作为边界。本教程使用morph_1d模块的morph_1d_dout_vld打3拍作为morph_2d模块的数据输出有效信号。二维输出的边界图如下所示:
FPGA形态学滤波设计_第8张图片
通过以上分析,容易得到din数据流经过morph_2d模块,场同步信号延时了KSZ+3-radius时钟。

二维形态学开运算子模块(morph_open_2d)设计

二维的开运算模块设计相对来说比较简单,其设计框图如下所示:
在这里插入图片描述
容易得到din输入数据经过morph_open_2d模块后,场同步信号延时了2*(KSZ+3-radius)拍。

二维形态学Tophat变换模块(morph_tophat_2d)设计

二维Tophat滤波模块设计需要等待原图开运算结束,结束后将原图与开运算结果相减并输出,设计框图如下所示:
FPGA形态学滤波设计_第9张图片
由上节可以得知,din数据经过morph_open_2d模块后,经过2*(KSZ+3-radius)时钟才能输出图像数据,同时考虑到line_fifo读数据也会延时一拍,所以din输入数据经过delay延时,即2*(KSZ+3-radius)-1时钟延时,经过延时后的输入数据将会与morph_open_2d模块输出的数据对齐。

从图9可以看出,腐蚀/膨胀模块输出的上边界是2radius行,其中radius行原本是下边界的,为了对齐方便,将原本下边界的radius移到了上边界了,相当于有效图像数据往下移了radius行,而开运算是先腐蚀后膨胀,所以经过开运算后,就相当于图像数据往下移动了2radius行。所以din输入数据需要缓存2*radius行才能和开运算输出的有效数据对齐!!!

这个地方有点不好理解,总的来说,就是要对齐数据!!!

调试

源码和调试过程我就不再贴图了,后面会给出源码的下载方式。下面将直接给图效果图,以供大家参考对比。

腐蚀效果图

FPGA形态学滤波设计_第10张图片
FPGA形态学滤波设计_第11张图片
FPGA形态学滤波设计_第12张图片

膨胀效果图

FPGA形态学滤波设计_第13张图片
FPGA形态学滤波设计_第14张图片

开运算效果图

FPGA形态学滤波设计_第15张图片

tophat变换效果图

FPGA形态学滤波设计_第16张图片
FPGA形态学滤波设计_第17张图片

福利

本教程的所有verilog源码以及上位机源码都会公布,微信扫描下面的二维码关注[春哥笔记]公众号,回复“形态学滤波”即可Get源码的获取方式。
FPGA形态学滤波设计_第18张图片

你可能感兴趣的:(FPGA,数字图像处理,形态学,腐蚀,膨胀)