1. 概述

本设计采用FPGA技术,实现CMOS视频图像的Tophat形态学滤波,并通过以太网传输(UDP方式)给PC实时显示。

2. 硬件系统框图

CMOS采用MT9V011(30万像素),FPGA采用ALTERA公司的CYCLONE IV,以太网卡采用REALTK公司的100M网卡芯片,硬件框图如下:

5e172e52e735986a7f74745683495585.png-wh_

硬件平台采用ETree的FPGA开发板,如下图所示:

b98693c25df1d9329ee64d09892fd11b.jpg-wh_

3. 算法原理

Tophat变换是原图像与开运算结果之差,突显出图像轮廓周围更亮的区域。

开运算(Opening)是先腐蚀后膨胀的过程。开运算一般是对象的轮廓变得更加光滑,断开狭窄的间断和消除细小的凸起物。因此,开运算可用于消除小物体。

膨胀是形态学滤波的基本运算。膨胀(dilate)就是求局部最大值,这样会使图像中的高亮区域逐渐增大,效果图将会拥有比原图更大的高亮区域,整体亮度会增加,同时可以连通相邻的高亮区域。

腐蚀(erode)是形态学滤波的基本运算,与膨胀是一对对立操作,求局部最小值。通过腐蚀操作后,高亮区域被腐蚀掉,会比原图更暗些。腐蚀操作会连通相邻比较暗的区域。

具体的计算公式如下:

dddd94952807c1e02fdf27e778632c51.jpg-wh_

4. 算法实现

在“开运算”输出端用原图像减去“开运算”的结果,代码如下。

//file name:    filter_tophat.v
//author:      shugen.yin
//date:        2017.10.27
//function:     开运算
//log:

module filter_tophat(
    input cmos_pclk,
    input cmos_href,
    input cmos_vsync,
    input [7:0] cmos_data,
    
    output  cmos_href_o,
    output  cmos_vsync_o,
    output  [7:0] cmos_data_o
);

wire [7:0] cmos_data_open;
wire [7:0] cmos_data_old;

filter_open filter_open_inst
(
    .cmos_pclk(cmos_pclk) , // input  cmos_pclk_sig
    .cmos_href(cmos_href) , // input  cmos_href_sig
    .cmos_vsync(cmos_vsync) ,   // input  cmos_vsync_sig
    .cmos_data_old(cmos_data_old),
    .cmos_data(cmos_data) , // input [7:0] cmos_data_sig
    .cmos_href_o(cmos_href_o) , // output  cmos_href_o_sig
    .cmos_vsync_o(cmos_vsync_o) ,   // output  cmos_vsync_o_sig
    .cmos_data_o(cmos_data_open)    // output [7:0] cmos_data_o_sig
);

assign cmos_data_o = (cmos_data_old>=cmos_data_open)?(cmos_data_old-cmos_data_open):8'h00;

endmodule

与Tophat对应的还有一个Blackhat形态滤波器,用“闭运算”减去原来图像,突显出原图像轮廓周围更暗的区域。“Blackhat形态学滤波器”留给有兴趣的读者完成,算法实现方法和本篇类似。


5. 最终效果

下图为原始图片效果。

783bec478fe2183fc438f82a84e12c5c.png-wh_

Tophat滤波后的效果图如下所示,图像轮廓周围更亮的区域被突显出来。

bd2923f572ce8aa5fa75ad39856a62af.png-wh_