车牌识别项目(2)膨胀与腐蚀方案

膨胀与腐蚀

参考博客如下链接,本文为自学后的总结整理

数学形态学运算——腐蚀、膨胀、开运算、闭运算
原理介绍

这里写图片描述

这里写图片描述

这里写图片描述这里写图片描述

这里写图片描述

这里写图片描述

开运算就是先腐蚀再膨胀,闭运算就是先膨胀再腐蚀

腐蚀看起来的效果就是让前景物体缩小了一圈一样。对于前景物体中一些细小的连接处,如果结构元素大小相等,这些连接处就会被断开。

膨胀看起来的效果就是让前景物体胀大了一圈一样。对于前景物体中一些细小的断裂处,如果结构元素大小相等,这些断裂的地方就会被连接起来。

基于FPGA灰度图像的膨胀算法的实现
本地化的膨胀&腐蚀原理

上述几张图片的方案相对来说比较复杂一些,我们这里采用简单的取最大值最小值的方法。简单来说,膨胀(dialate)就是求局部最大值的操作,腐蚀就是求局部最小值的操作。

从数学角度来看就是将图像f和核(结构元)b进行卷积的一个过程。

当b的原点位于(x,y)处时,用一个平坦的结构元b在(x,y)处对图像f的膨胀,定义为图像f中与b重合区域的最大值,即:
在这里插入图片描述

为了方便起见,将膨胀操作记为:
在这里插入图片描述

(x,y)表示当前输入图像的行列坐标;
f(x,y)表示坐标点(x,y)处的图像像素值;
g(x,y)表示坐标点(x,y)处的滤波结果;
(s,t)表示作用域。

膨胀模块的设计

比较子模块
一维形态学膨胀子模块
二维形态学膨胀子模块

比较子模块

为了代码更好的移植,我们将比较子模块设计为独立的子模块。

Erode:输出俩个数据的较小值。
在这里插入图片描述

比较子模块源码
`timescale1ns/1ps
module minmax(
      clk, //pixel clock
         rst_n,
         data_valid,
         din,
         din_r,
         dout_min,
         dout_max
         );
parameter WIDTH = 8;        // data width 8 bit
parameter USE_REG = 1; // USE_REG = 1Data delay 1ns output.  USE_REG = 0 Don'tdelay.   
input               clk;  //pixel clock
input               rst_n;
input               data_valid;
input  [WIDTH-1:0] din;
input  [WIDTH-1:0] din_r;
output [WIDTH-1:0] dout_min;
output [WIDTH-1:0] dout_max;     
wire minmax_flag;
wire [WIDTH-1:0] min_temp;
wire [WIDTH-1:0] max_temp;
reg  [WIDTH-1:0] min_reg;
reg  [WIDTH-1:0] max_reg;
// min or max flag
assign minmax_flag = (din > din_r) ? 1'b1:1'b0;
// min
assign min_temp = (minmax_flag == 1'b1) ? din_r : din;
// max
assign max_temp = (minmax_flag == 1'b1) ? din : din_r;
// USE_REG == 1
generate
if(USE_REG== 1)
begin: MAP0
  always @(posedge clk) begin
    if(data_valid) begin
        min_reg <= #1 min_temp;
        max_reg <= #1 max_temp;
       end
  end
  assign dout_min = min_reg;
  assign dout_max = max_reg;
end
endgenerate
//USE_REG == 0
generate
if(~(USE_REG== 1))
begin: MAP1
  assign dout_min = min_temp;
  assign dout_max = max_temp;
end
endgenerate
endmodule

`timescale1ns/1ps
`defineWIDTH 8
`defineCLK_PERIOD 10
module minmax_tb();
       reg               clk; //pixel clock
         reg               rst_n;
         reg               data_valid;
         reg  [`WIDTH-1:0] din;
         reg  [`WIDTH-1:0] din_r;
         wire [`WIDTH-1:0] dout_min;
         wire [`WIDTH-1:0] dout_max;
minmax minmax_inst(
        .clk(clk),  //pixel clock
          .rst_n(rst_n),
          .data_valid(data_valid),
          .din(din),
              .din_r(din_r),
          .dout_min(dout_min),
          .dout_max(dout_max)
         );
         initial begin
           clk = 0;
               rst_n = 0;
               data_valid = 0;
               #(`CLK_PERIOD*10);
               rst_n = 1;
           #(`CLK_PERIOD*10);
               data_valid = 1;
               #(`CLK_PERIOD*100);
               data_valid = 0;
               #(`CLK_PERIOD*10);
               $stop;
         end
always#(`CLK_PERIOD/2)       clk = ~clk;  
always@(posedge clk or negedge rst_n) begin
  if(!rst_n)
    din <= 8'd0;
  else if(data_valid)
    din <= {$random}%255;
  else
    din <= 8'b0;
end
always@(posedge clk or negedge rst_n) begin
  if(!rst_n)
    din_r <= 8'd0;
  else if(data_valid)
    din_r <= din;
  else
    din_r <= 8'b0;
end
endmodule
比较子模块仿真源码

当我们需要做膨胀算法时,数据取dout_max;当我们需要做腐蚀算法时,数据取dout_min.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值