芯路恒电子技术论坛

 找回密码
 立即注册

扫一扫,访问微社区

热搜: 活动
查看: 405|回复: 1

基于FPGA形态学开运算、闭运算和梯度的实现

[复制链接]
  • TA的每日心情
    开心
    2018-8-6 10:25
  • 8

    主题

    8

    帖子

    900

    积分

    高级会员

    Rank: 6Rank: 6

    积分
    900
    发表于 2018-6-7 20:48:51 | 显示全部楼层 |阅读模式
    基于FPGA形态学开运算、闭运算和梯度的实现
    作者:OpenS_Lee
    1 概述
        开运算一般平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。闭运算同样也会平滑轮廓的一部分,但与开操作相反,它通常会弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线的中的断裂。
    形态学开运算与闭运算:
    形态学开运算就是先对图像进行腐蚀然后在膨胀,表达式即:
    image002.gif
    形态学闭运算就是先对图像进行膨胀然后在腐蚀,表达式即:
    image004.gif
    image006.jpg
    1 开运算和闭运算演示(原图由美国国家标准和技术研究所提供)
    如图1所示,a为噪声图像,b为结构元,c为腐蚀后的图像,d为A的开运算,e为开运算的膨胀,f为开运算的闭运算。f相对于a经过了一系列的形态学运算之后纹理变得更加清晰,只为后期的指纹识别打下基础。
    膨胀和腐蚀可与图像相减结合起来得到一幅图像的形态学梯度。
    形态学梯度:
    灰度图像的膨胀减去灰度图像的腐蚀就是形态学梯度,表达式:
    image008.gif
    image010.jpg
    2 CT扫描头部图像
    如图2所示,a为头部CT扫描图像,b为膨胀后的结果,c为腐蚀后的结果,d为形态学梯度。计算图b与图c的差得到图d,图d显示出了区域间的边界被清楚地描绘出来。这与二维微分图像的预期结果相同。
    2 matlab实现
    基于matlab的形态学开运算以及闭运算源码:
    %% image open close
    clear all
    img_a = imread('flower.bmp');
    figure,imshow(img_a);
    title('rgb');
    img_b = rgb2gray(img_a);
    figure,imshow(img_b);
    title('gray');
    a = [1,1,1;
         1,1,1;
         1,1,1];
    img_c = imopen(img_b,a);
    figure,imshow(img_c);
    title('open');
    img_d = imclose(img_b,a);
    figure,imshow(img_d);
    title('close');
    image012.jpg
    3 实验原图
    image014.jpg
    4 灰度图像
    image016.jpg
    5 开运算的结果
    image018.jpg
    6 闭运算的结果
    基于matlab的形态学梯度源码:
    %%gradient
    clear all
    img_a = imread('flower.bmp');
    figure,imshow(img_a);
    title('rgb');
    img_b = rgb2gray(img_a);
    figure,imshow(img_b);
    title('gray');
    a = [1,1,1;
         1,1,1;
         1,1,1];
    img_c = imerode(img_b, a);
    figure,imshow(img_c);
    title('erode');
    img_d = imdilate(img_b, a);
    figure,imshow(img_d);
    title('dilate');
    img_e = img_d -img_c;
    figure,imshow(img_e);
    title('gradient');
    img_f = img_b -img_c;
    figure,imshow(img_f);
    title('gradient1');
    img_g = img_d -img_b;
    figure,imshow(img_g);
    title('gradient2');
    image020.jpg
    7 梯度0
    image022.jpg
    8 梯度1
    image024.jpg
    9 梯度2
    3 FPGA实现
    image026.jpg
    10 为整个设计的RTL级电路图
    形态学开运算源码:
    //--------------------------------
    // open
    //--------------------------------                                          
    erode erode_inst(
         .clk(TFT_clk),
                  .rst_n(Rst_n),
                  .hs_in(o_hs),
                  .vs_in(o_vs),
                  .din(o_y_8b),
                  .din_valid(o_de),
                  .dout(erode_out),
                  .dout_valid(erode_de),
                  .hs_out(erode_hs),
                  .vs_out(erode_vs)
                  );     
    dilate dilate_inst(
         .clk(TFT_clk),
                  .rst_n(Rst_n),
                  .hs_in(erode_hs),
                  .vs_in(erode_vs),
                  .din(erode_out),
                  .din_valid(erode_de),
                  .dout(dilate_out),
                  .dout_valid(TFT_de),
                  .hs_out(TFT_hs),
                  .vs_out(TFT_vs)
                  );
    assign TFT_rgb ={dilate_out[7:3],dilate_out[7:2],dilate_out[7:3]};     //Y     
    结果:
    image028.jpg
    11 FPGA开运算效果
    形态学闭运算源码:
    //--------------------------------
    // close
    //--------------------------------                                          
    dilate dilate_inst(
         .clk(TFT_clk),
                  .rst_n(Rst_n),
                  .hs_in(o_hs),
                  .vs_in(o_vs),
                  .din(o_y_8b),
                  .din_valid(o_de),
                  .dout(dilate_out),
                  .dout_valid(dilate_de),
                  .hs_out(dilate_hs),
                  .vs_out(dilate_vs)
                  );     
    erode erode_inst(
         .clk(TFT_clk),
                  .rst_n(Rst_n),
                  .hs_in(dilate_hs),
                  .vs_in(dilate_vs),
                  .din(dilate_out),
                  .din_valid(dilate_de),
                  .dout(erode_out),
                  .dout_valid(TFT_de),
                  .hs_out(TFT_hs),
                  .vs_out(TFT_vs)
                  );
    assign TFT_rgb ={erode_out[7:3],erode_out[7:2],erode_out[7:3]};     //Y
    结果:
    image030.jpg
    12 FPGA闭运算效果
    形态学梯度源码:
    //---------------------------------------------
    //Morphologicalgradient.
    //---------------------------------------------                                       
    erode erode_inst(
          .clk(TFT_clk),
                  .rst_n(Rst_n),
                  .hs_in(o_hs),
                  .vs_in(o_vs),
                  .din(o_y_8b),
                  .din_valid(o_de),
                  .dout(erode_out),
                  .dout_valid(TFT_de),
                  .hs_out(TFT_hs),
                  .vs_out(TFT_vs)
                  );     
    dilate dilate_inst(
         .clk(TFT_clk),
                  .rst_n(Rst_n),
                  .hs_in(o_hs),
                  .vs_in(o_vs),
                  .din(o_y_8b),
                  .din_valid(o_de),
                  .dout(dilate_out),
                  .dout_valid(),
                  .hs_out(),
                  .vs_out()
                  );     
    assign dout =      dilate_out- erode_out;
    assign TFT_rgb ={dout[7:3],dout[7:2],dout[7:3]};     //Y
    //assignTFT_rgb = {o_y_8b[7:3],o_y_8b[7:2],o_y_8b[7:3]};     //Y      
    结果:
    image032.jpg
    13  FPGA形态学梯度效果
    总结:
        迄今为止许多形态学的技术都是以灰度级形态学概念为基础。这包括形态学平滑、形态学梯度、顶帽变换、底帽变换、粒度测定和纹理分割等。
      

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-19 09:37
  • 2

    主题

    8

    帖子

    155

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    155
    发表于 2018-6-8 10:36:11 | 显示全部楼层
    666666666
    回复

    使用道具 举报

    *滑动验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|手机版|Archiver|芯路恒电子技术论坛  

    GMT+8, 2018-8-21 03:58 , Processed in 0.224785 second(s), 12 queries , File On.

    Powered by Discuz! X3.3

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表