zoukankan      html  css  js  c++  java
  • FPGA实现图像的边缘检测:灰度形态学梯度

      前几篇博客介绍了二值图像的形态学图像处理,本篇博客整理一下灰度形态学的相关图像处理,最后实现基于灰度形态学梯度的边缘检测效果。

    一、腐蚀(Erode)

      灰度形态学腐蚀,即求局部最小值。以 3x3 模板为例,即找出该模板的最小值作为输出即可。

      通过灰度形态学腐蚀,图像中的高亮区域被腐蚀掉了,类似于“领域被蚕食”。可以预见的是腐蚀过后的图像将会拥有比原图更小的高亮区域,亮度会有所下降。同时,腐蚀操作还会连通相邻的比较暗的区域。这无疑对小尺寸的高亮区域识别是有益的。

      Verilog代码类似中值滤波,sort是一个排序模块,在中值滤波的博客中已经给出。

    //==========================================================================
    //==    腐蚀,求出局部最小值
    //==========================================================================
    //每行像素降序排列,clk1
    //---------------------------------------------------
    //第1行
    sort u1
    (
        .clk                    (clk                    ),
        .rst_n                  (rst_n                  ),
        .data1                  (matrix_11              ), 
        .data2                  (matrix_12              ), 
        .data3                  (matrix_13              ),
        .max_data               (max_data1              ),
        .mid_data               (mid_data1              ),
        .min_data               (min_data1              )
    );
    
    //第2行
    sort u2
    (
        .clk                    (clk                    ),
        .rst_n                  (rst_n                  ),
        .data1                  (matrix_21              ),
        .data2                  (matrix_22              ),
        .data3                  (matrix_23              ),
        .max_data               (max_data2              ),
        .mid_data               (mid_data2              ),
        .min_data               (min_data2              )
    );
    
    //第3行
    sort u3
    (
        .clk                    (clk                    ),
        .rst_n                  (rst_n                  ),
        .data1                  (matrix_31              ),
        .data2                  (matrix_32              ),
        .data3                  (matrix_33              ),
        .max_data               (max_data3              ),
        .mid_data               (mid_data3              ),
        .min_data               (min_data3              )
    );
    
    //三行的最小值取最小值,clk2
    //---------------------------------------------------
    //min-max
    sort u4
    (
        .clk                    (clk                    ),
        .rst_n                  (rst_n                  ),
        .data1                  (min_data1              ),
        .data2                  (min_data2              ),
        .data3                  (min_data3              ),
        .max_data               (                       ),
        .mid_data               (                       ),
        .min_data               (min_min_data           )
    );
    
    assign erode_data = min_min_data;

    二、膨胀(Dilate)

      灰度形态学膨胀,即求局部最大值。以 3x3 模板为例,即找出该模板的最大值作为输出即可。

      通过灰度形态学膨胀,图像中的高亮区域逐渐增长,类似于“领域扩展”。可以预见的是膨胀过后的图像将会拥有比原图更大的高亮区域,亮度会有所增加。同时,腐蚀操作还会连通相邻的比较亮的区域。通过膨胀我们可以将图像中的裂缝得以填补。例如,破镜子照片通过膨胀可以恢复出完整的样子。

      Verilog代码类似中值滤波,sort是一个排序模块,在中值滤波的博客中已经给出。

    //==========================================================================
    //==    腐蚀,求出局部最大值
    //==========================================================================
    //每行像素降序排列,clk1
    //---------------------------------------------------
    //第1行
    sort u1
    (
        .clk                    (clk                    ),
        .rst_n                  (rst_n                  ),
        .data1                  (matrix_11              ), 
        .data2                  (matrix_12              ), 
        .data3                  (matrix_13              ),
        .max_data               (max_data1              ),
        .mid_data               (mid_data1              ),
        .min_data               (min_data1              )
    );
    
    //第2行
    sort u2
    (
        .clk                    (clk                    ),
        .rst_n                  (rst_n                  ),
        .data1                  (matrix_21              ),
        .data2                  (matrix_22              ),
        .data3                  (matrix_23              ),
        .max_data               (max_data2              ),
        .mid_data               (mid_data2              ),
        .min_data               (min_data2              )
    );
    
    //第3行
    sort u3
    (
        .clk                    (clk                    ),
        .rst_n                  (rst_n                  ),
        .data1                  (matrix_31              ),
        .data2                  (matrix_32              ),
        .data3                  (matrix_33              ),
        .max_data               (max_data3              ),
        .mid_data               (mid_data3              ),
        .min_data               (min_data3              )
    );
    
    //三行的最大值取最大值,clk2
    //---------------------------------------------------
    //min-max
    sort u4
    (
        .clk                    (clk                    ),
        .rst_n                  (rst_n                  ),
        .data1                  (max_data1              ),
        .data2                  (max_data2              ),
        .data3                  (max_data3              ),
        .max_data               (max_max_data           ),
        .mid_data               (                       ),
        .min_data               (                       )
    );
    
    assign dilate_data = max_max_data;

    三、开运算(Open)和闭运算(Close)

      和二值形态学的开闭运算完全一样。

      开运算:先腐蚀后膨胀。常用于去除较小的高灰度区域,图像的整体灰度基本保持不变。

      闭运算:先膨胀后腐蚀。常用于去除图像中的暗细节部分,相对地保留高灰度部分不受影响。

    四、顶帽变换(top-hat)和底帽变换(bottom-hat)

      二者都常用于处理光照不均的图像。

      顶帽变换:原图像 - 开运算。用于暗背景上的亮物体,又称为白顶帽变换。

      底帽变换:闭运算 - 原图像。用于亮背景上的暗物体,又称为黑底帽变换。

    五、灰度形态学梯度(Morphological Gradient)

      灰度形态学梯度,即:膨胀 - 腐蚀。

      膨胀粗化一幅图像中的区域, 而腐蚀则细化它们。膨胀和腐蚀的差强调了区域间的边界。同质区域不受影响(只要SE相对较小),因此相减操作趋于消除同质区域。最终结果是是边缘被增强而同质区域的贡献被抑制掉了的图像,从而产生“类似于微分”(梯度)的效果。

    assign data = dilate_data - erode_data;

      灰度形态学梯度最后呈现的效果类似边缘检测,比较酷炫。

       这种边缘检测效果具有层次感,但线条略暗。截图看起来很普通,实际视频效果是非常惊艳的。

     参考资料:

    [1] OpenS Lee:FPGA开源工作室(公众号)

    [2] Rafael C.Gonzalez、Richard E.Woods著,阮秋琦、阮宇智等译.数字图像处理(第三版).电子工业出版社.2013.

    [3] 牟新刚、周晓、郑晓亮.基于FPGA的数字图像处理原理及应用[M]. 电子工业出版社,2017.

    [4] 张铮, 王艳平, 薛桂香. 数字图像处理与机器视觉[M]. 人民邮电出版社, 2010.

  • 相关阅读:
    【Qt】splitter
    android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件
    poj 1879 Truck History
    在LinuxMint中对firefox进行手动安装flash插件
    王立平--include在Android中的应用
    【IPC进程间通讯之二】管道Pipe
    我组织类时无意间遵守了依赖倒置原则
    百度2016笔试(算法春招实习)
    制作翻转效果动画
    vim常用命令行备忘总结
  • 原文地址:https://www.cnblogs.com/xianyufpga/p/12570362.html
Copyright © 2011-2022 走看看