FPGA图像处理惩罚(六)------ 图像腐蚀and图像膨胀

[复制链接]
发表于 2025-8-21 10:33:42 | 显示全部楼层 |阅读模式
默认迭代次数为1,只举行一次腐蚀、膨胀
一、图像腐蚀

1.相关界说 


2.图像腐蚀结果图

 

3.fpga实现 

彩色图像灰度化,灰度图像二值化,图像缓存天生滤波模块(3*3),图像腐蚀算法
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Description: 图像腐蚀 (前景色是黑色(0),背景色是白色(1)  腐蚀黑色)
  4. //////////////////////////////////////////////////////////////////////////////////
  5. module image_erode(
  6.    input wire           clk             ,
  7.    input wire           reset           ,
  8.    
  9.    input wire [10:0]    img_width       ,
  10.    input wire [9:0]     img_height      ,
  11.    
  12.    input wire           valid_i         ,
  13.    input wire [23:0]    last_line_data  ,
  14.    input wire [23:0]    cur_line_data   ,
  15.    input wire [23:0]    next_line_data  ,
  16.    
  17.    output reg           valid_o         ,
  18.    output reg [23:0]    img_data_o
  19. );
  20.     //常量声明
  21.     parameter N = 3; //窗口大小
  22.     //结构系数模版为{1,1,1,
  23.     //              1,1,1,
  24.     //              1,1,1}
  25.     //变量声明
  26.     reg         valid_d1;
  27.     reg [23:0]  last_line_data_d1, last_line_data_d2;
  28.     reg [23:0]  cur_line_data_d1 , cur_line_data_d2 ;
  29.     reg [23:0]  next_line_data_d1, next_line_data_d2;
  30.     //中心点位置,为cur_line_data_d1
  31.     always@(posedge clk or posedge reset) begin
  32.         if(reset) begin
  33.             valid_d1 <= 0;
  34.             {last_line_data_d1, last_line_data_d2} <= 0;
  35.             {cur_line_data_d1 , cur_line_data_d2 } <= 0;
  36.             {next_line_data_d1, next_line_data_d2} <= 0;
  37.         end else begin
  38.             valid_d1 <= valid_i;
  39.             last_line_data_d1 <= last_line_data;
  40.             last_line_data_d2 <= last_line_data_d1;
  41.             cur_line_data_d1  <= cur_line_data;
  42.             cur_line_data_d2  <= cur_line_data_d1;
  43.             next_line_data_d1 <= next_line_data;
  44.             next_line_data_d2 <= next_line_data_d1;
  45.         end
  46.     end
  47.     //模板窗口范围内判断,前景色是黑色,背景色是白色,腐蚀处理就是前景色黑色减少
  48.     //简单理解也就是,3*3窗口中所有像素值都是0时,才能将当前像素值为0输出
  49.     always@(posedge clk or posedge reset) begin
  50.         if(reset) begin
  51.             valid_o <= 0;
  52.             img_data_o <= 0;
  53.         end
  54.         else if(valid_d1) begin
  55.             if({last_line_data_d2, last_line_data_d1, last_line_data,
  56.                 cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,
  57.                 next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd0}}) begin
  58.                 img_data_o <= cur_line_data_d1;
  59.                     
  60.             end
  61.             else begin
  62.                 img_data_o <= {3{8'd255}};   
  63.             end
  64.             valid_o <= 1'b1;
  65.         end
  66.         else begin
  67.             valid_o <= 0;
  68.             img_data_o <= 0;
  69.         end
  70.     end
  71.       
  72. endmodule
复制代码
明显可以看书汉字部分,经过腐蚀运算之后,白色字体变宽了(要是清晰表现文字,应该腐蚀白色,结果可能更好一点) 


二、图像膨胀

1.相关界说



 2.图像膨胀与图像腐蚀的联系


 3.FPGA实现
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Description: 图像膨胀 (前景色是黑色,背景色是白色  只要覆盖区域有前景色则膨胀黑色)
  4. //////////////////////////////////////////////////////////////////////////////////
  5. module image_dilate(
  6.    input  wire          clk             ,
  7.    input  wire          reset           ,
  8.    
  9.    input  wire [10:0]   img_width       ,
  10.    input  wire [9:0]    img_height      ,
  11.    
  12.    input  wire          valid_i         ,
  13.    input  wire [23:0]   last_line_data  ,
  14.    input  wire [23:0]   cur_line_data   ,
  15.    input  wire [23:0]   next_line_data  ,
  16.    
  17.    output reg           valid_o         ,
  18.    output reg [23:0]    img_data_o      
  19. );
  20.     //常量声明
  21.     parameter N = 3; //窗口大小
  22.     //结构系数模版为{1,1,1,1,1,1,1,1,1}
  23.     //变量声明
  24.     reg valid_d1;
  25.     reg [23:0] last_line_data_d1, last_line_data_d2;
  26.     reg [23:0] cur_line_data_d1 , cur_line_data_d2 ;
  27.     reg [23:0] next_line_data_d1, next_line_data_d2;
  28.     //中心点位置,为cur_line_data_d1
  29.     always@(posedge clk or posedge reset) begin
  30.         if(reset) begin
  31.             valid_d1 <= 0;
  32.             {last_line_data_d1, last_line_data_d2} <= 0;
  33.             {cur_line_data_d1 , cur_line_data_d2 } <= 0;
  34.             {next_line_data_d1, next_line_data_d2} <= 0;
  35.         end else begin
  36.             valid_d1 <= valid_i;
  37.             last_line_data_d1 <= last_line_data;
  38.             last_line_data_d2 <= last_line_data_d1;
  39.             cur_line_data_d1  <= cur_line_data;
  40.             cur_line_data_d2  <= cur_line_data_d1;
  41.             next_line_data_d1 <= next_line_data;
  42.             next_line_data_d2 <= next_line_data;
  43.         end
  44.     end
  45.     //模板窗口范围内判断,前景色是黑色,背景色是白色,膨胀处理就是前景色黑色扩张
  46.     //简单理解也就是,3*3窗口中所有像素值都是255(白)时,才能将当前像素值为255输出
  47.     always@(posedge clk or posedge reset) begin
  48.         if(reset) begin
  49.             valid_o <= 0;
  50.             img_data_o <= 0;
  51.         end else if(valid_d1) begin
  52.             if({last_line_data_d2, last_line_data_d1, last_line_data,
  53.                 cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,
  54.                 next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd255}}) begin
  55.                 img_data_o <= cur_line_data_d1;
  56.                     
  57.             end else begin
  58.                 img_data_o <= 0;   
  59.             end
  60.             valid_o <= 1'b1;
  61.         end else begin
  62.             valid_o <= 0;
  63.             img_data_o <= 0;
  64.         end
  65.     end
  66. endmodule
复制代码


 三、图像处理惩罚的开运算,闭运算和梯度运算

1.相关界说 



2.fpga实现 

开运算:

闭运算 :

梯度运算:
  1. module image_process_top(
  2.    input wire clk,
  3.    input wire reset,
  4.    
  5.    input wire [10:0] img_width,
  6.    input wire [9:0] img_height,
  7.    
  8.    input wire valid_i,
  9.    input wire [23:0] img_data_i,
  10.    
  11.    output wire valid_o,
  12.    output wire [23:0] img_data_o
  13.     );
  14.     //参数定义
  15.     wire rgb2gray_valid;
  16.     wire [23:0] rgb2gray_data;
  17.     wire binary_valid;
  18.     wire [23:0] binary_data;
  19.     wire line_valid;
  20.     wire [23:0] last_line_data, cur_line_data, next_line_data;
  21.    
  22.     wire erode_valid;
  23.     wire [23:0] erode_data;
  24.    
  25.     wire dilate_valid;
  26.     wire [23:0] dilate_data;
  27.    
  28.     wire line1_valid;
  29.     wire [23:0] last_line1_data, cur_line1_data, next_line1_data;
  30.    
  31.     //灰度化处理
  32.     image_rgb2gray u_image_rgb2gray(
  33.     .clk        ( clk        ),
  34.     .reset      ( reset      ),
  35.     .valid_i    ( valid_i    ),
  36.     .img_data_i ( img_data_i ),
  37.     .valid_o    ( rgb2gray_valid    ),
  38.     .img_data_o  ( rgb2gray_data  )
  39.     );
  40.     //二值化处理
  41.      image_binary u_image_binary(
  42.     .clk        ( clk        ),
  43.     .reset      ( reset      ),
  44.     .valid_i    ( rgb2gray_valid    ),
  45.     .img_data_i ( rgb2gray_data ),
  46.     .valid_o    ( binary_valid    ),
  47.     .img_data_o  ( binary_data  )
  48.     );
  49.     //////////////////////////开运算
  50. /*
  51.     //3行缓存
  52.     image_line_buffer u_image_line_buffer(
  53.     .clk            ( clk            ),
  54.     .reset          ( reset          ),
  55.     .img_width      ( img_width      ),
  56.     .img_height     ( img_height     ),
  57.     .valid_i        ( binary_valid ),
  58.     .img_data_i     ( binary_data ),
  59.     .valid_o        ( line_valid        ),
  60.     .last_line_data ( last_line_data ),
  61.     .cur_line_data  ( cur_line_data  ),
  62.     .next_line_data  ( next_line_data  )
  63.     );
  64.     //图像腐蚀
  65.     image_erode u_image_erode(
  66.     .clk            ( clk            ),
  67.     .reset          ( reset          ),
  68.     .img_width      ( img_width      ),
  69.     .img_height     ( img_height     ),
  70.     .valid_i        ( line_valid        ),
  71.     .last_line_data ( last_line_data ),
  72.     .cur_line_data  ( cur_line_data  ),
  73.     .next_line_data ( next_line_data ),
  74.     .valid_o        ( erode_valid    ),
  75.     .img_data_o     ( erode_data     )
  76.     );
  77.     //3行缓存
  78.     image_line_buffer u_image_line_buffer1(
  79.     .clk            ( clk            ),
  80.     .reset          ( reset          ),
  81.     .img_width      ( img_width      ),
  82.     .img_height     ( img_height     ),
  83.     .valid_i        ( erode_valid ),
  84.     .img_data_i     ( erode_data ),
  85.     .valid_o        ( line1_valid        ),
  86.     .last_line_data ( last_line1_data ),
  87.     .cur_line_data  ( cur_line1_data  ),
  88.     .next_line_data  ( next_line1_data  )
  89.     );
  90.     //图像膨胀
  91.     image_dilate u_image_dilate(
  92.     .clk            ( clk            ),
  93.     .reset          ( reset          ),
  94.     .img_width      ( img_width      ),
  95.     .img_height     ( img_height     ),
  96.     .valid_i        ( line1_valid        ),
  97.     .last_line_data ( last_line1_data ),
  98.     .cur_line_data  ( cur_line1_data  ),
  99.     .next_line_data ( next_line1_data ),
  100.     .valid_o        ( valid_o        ),
  101.     .img_data_o     ( img_data_o     )
  102.     );
  103. */
  104.     //////////////////////////闭运算
  105. /*
  106.     //3行缓存
  107.     image_line_buffer u_image_line_buffer(
  108.     .clk            ( clk            ),
  109.     .reset          ( reset          ),
  110.     .img_width      ( img_width      ),
  111.     .img_height     ( img_height     ),
  112.     .valid_i        ( binary_valid ),
  113.     .img_data_i     ( binary_data ),
  114.     .valid_o        ( line_valid        ),
  115.     .last_line_data ( last_line_data ),
  116.     .cur_line_data  ( cur_line_data  ),
  117.     .next_line_data  ( next_line_data  )
  118.     );
  119.     //图像膨胀
  120.     image_dilate u_image_dilate(
  121.     .clk            ( clk            ),
  122.     .reset          ( reset          ),
  123.     .img_width      ( img_width      ),
  124.     .img_height     ( img_height     ),
  125.     .valid_i        ( line_valid        ),
  126.     .last_line_data ( last_line_data ),
  127.     .cur_line_data  ( cur_line_data  ),
  128.     .next_line_data ( next_line_data ),
  129.     .valid_o        ( dilate_valid    ),
  130.     .img_data_o     ( dilate_data     )
  131.     );
  132.     //3行缓存
  133.     image_line_buffer u_image_line_buffer1(
  134.     .clk            ( clk            ),
  135.     .reset          ( reset          ),
  136.     .img_width      ( img_width      ),
  137.     .img_height     ( img_height     ),
  138.     .valid_i        ( dilate_valid ),
  139.     .img_data_i     ( dilate_data ),
  140.     .valid_o        ( line1_valid        ),
  141.     .last_line_data ( last_line1_data ),
  142.     .cur_line_data  ( cur_line1_data  ),
  143.     .next_line_data  ( next_line1_data  )
  144.     );
  145.     //图像腐蚀
  146.     image_erode u_image_erode(
  147.     .clk            ( clk            ),
  148.     .reset          ( reset          ),
  149.     .img_width      ( img_width      ),
  150.     .img_height     ( img_height     ),
  151.     .valid_i        ( line1_valid        ),
  152.     .last_line_data ( last_line1_data ),
  153.     .cur_line_data  ( cur_line1_data  ),
  154.     .next_line_data ( next_line1_data ),
  155.     .valid_o        ( valid_o        ),
  156.     .img_data_o     ( img_data_o     )
  157.     );
  158. */
  159.     //////////////////////////梯度运算
  160.     //3行缓存
  161.     image_line_buffer u_image_line_buffer(
  162.     .clk            ( clk            ),
  163.     .reset          ( reset          ),
  164.     .img_width      ( img_width      ),
  165.     .img_height     ( img_height     ),
  166.     .valid_i        ( binary_valid ),
  167.     .img_data_i     ( binary_data ),
  168.     .valid_o        ( line_valid        ),
  169.     .last_line_data ( last_line_data ),
  170.     .cur_line_data  ( cur_line_data  ),
  171.     .next_line_data  ( next_line_data  )
  172.     );
  173.     //图像膨胀
  174.     image_dilate u_image_dilate(
  175.     .clk            ( clk            ),
  176.     .reset          ( reset          ),
  177.     .img_width      ( img_width      ),
  178.     .img_height     ( img_height     ),
  179.     .valid_i        ( line_valid        ),
  180.     .last_line_data ( last_line_data ),
  181.     .cur_line_data  ( cur_line_data  ),
  182.     .next_line_data ( next_line_data ),
  183.     .valid_o        ( dilate_valid    ),
  184.     .img_data_o     ( dilate_data     )
  185.     );
  186.     //图像腐蚀
  187.     image_erode u_image_erode(
  188.     .clk            ( clk            ),
  189.     .reset          ( reset          ),
  190.     .img_width      ( img_width      ),
  191.     .img_height     ( img_height     ),
  192.     .valid_i        ( line_valid        ),
  193.     .last_line_data ( last_line_data ),
  194.     .cur_line_data  ( cur_line_data  ),
  195.     .next_line_data ( next_line_data ),
  196.     .valid_o        ( erode_valid    ),
  197.     .img_data_o     ( erode_data     )
  198.     );
  199.     assign valid_o = dilate_valid;
  200.     assign img_data_o = (dilate_data == 0)&&(erode_data == {3{8'd255}}) ? 0 : {3{8'd255}};
  201. endmodule
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表