当前位置: 首页 > news >正文

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

默认迭代次数为1,只进行一次腐蚀、膨胀

一、图像腐蚀

1.相关定义 

2.图像腐蚀效果图

 

3.fpga实现 

彩色图像灰度化,灰度图像二值化,图像缓存生成滤波模块(3*3),图像腐蚀算法

`timescale 1ns / 1ps
//
// Description: 图像腐蚀 (前景色是黑色(0),背景色是白色(1)  腐蚀黑色)
//
module image_erode(input wire           clk             ,input wire           reset           ,input wire [10:0]    img_width       ,input wire [9:0]     img_height      ,input wire           valid_i         ,input wire [23:0]    last_line_data  ,input wire [23:0]    cur_line_data   ,input wire [23:0]    next_line_data  ,output reg           valid_o         ,output reg [23:0]    img_data_o
);//常量声明parameter N = 3; //窗口大小//结构系数模版为{1,1,1,//              1,1,1,//              1,1,1}//变量声明reg         valid_d1;reg [23:0]  last_line_data_d1, last_line_data_d2;reg [23:0]  cur_line_data_d1 , cur_line_data_d2 ;reg [23:0]  next_line_data_d1, next_line_data_d2;//中心点位置,为cur_line_data_d1always@(posedge clk or posedge reset) beginif(reset) beginvalid_d1 <= 0;{last_line_data_d1, last_line_data_d2} <= 0;{cur_line_data_d1 , cur_line_data_d2 } <= 0;{next_line_data_d1, next_line_data_d2} <= 0;end else beginvalid_d1 <= valid_i;last_line_data_d1 <= last_line_data;last_line_data_d2 <= last_line_data_d1;cur_line_data_d1  <= cur_line_data;cur_line_data_d2  <= cur_line_data_d1;next_line_data_d1 <= next_line_data;next_line_data_d2 <= next_line_data_d1;endend//模板窗口范围内判断,前景色是黑色,背景色是白色,腐蚀处理就是前景色黑色减少//简单理解也就是,3*3窗口中所有像素值都是0时,才能将当前像素值为0输出always@(posedge clk or posedge reset) beginif(reset) beginvalid_o <= 0;img_data_o <= 0;end else if(valid_d1) beginif({last_line_data_d2, last_line_data_d1, last_line_data,cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd0}}) beginimg_data_o <= cur_line_data_d1;end else beginimg_data_o <= {3{8'd255}};   endvalid_o <= 1'b1;end else beginvalid_o <= 0;img_data_o <= 0;endendendmodule

明显可以看书汉字部分,经过腐蚀运算之后,白色字体变宽了(要是清晰显示文字,应该腐蚀白色,效果可能更好一点) 


二、图像膨胀

1.相关定义

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

 3.FPGA实现

`timescale 1ns / 1ps
//
// Description: 图像膨胀 (前景色是黑色,背景色是白色  只要覆盖区域有前景色则膨胀黑色)
//
module image_dilate(input  wire          clk             ,input  wire          reset           ,input  wire [10:0]   img_width       ,input  wire [9:0]    img_height      ,input  wire          valid_i         ,input  wire [23:0]   last_line_data  ,input  wire [23:0]   cur_line_data   ,input  wire [23:0]   next_line_data  , output reg           valid_o         ,output reg [23:0]    img_data_o      
);//常量声明parameter N = 3; //窗口大小//结构系数模版为{1,1,1,1,1,1,1,1,1}//变量声明reg valid_d1;reg [23:0] last_line_data_d1, last_line_data_d2;reg [23:0] cur_line_data_d1 , cur_line_data_d2 ;reg [23:0] next_line_data_d1, next_line_data_d2;//中心点位置,为cur_line_data_d1always@(posedge clk or posedge reset) beginif(reset) beginvalid_d1 <= 0;{last_line_data_d1, last_line_data_d2} <= 0;{cur_line_data_d1 , cur_line_data_d2 } <= 0;{next_line_data_d1, next_line_data_d2} <= 0;end else beginvalid_d1 <= valid_i;last_line_data_d1 <= last_line_data;last_line_data_d2 <= last_line_data_d1;cur_line_data_d1  <= cur_line_data;cur_line_data_d2  <= cur_line_data_d1;next_line_data_d1 <= next_line_data;next_line_data_d2 <= next_line_data;endend//模板窗口范围内判断,前景色是黑色,背景色是白色,膨胀处理就是前景色黑色扩张//简单理解也就是,3*3窗口中所有像素值都是255(白)时,才能将当前像素值为255输出always@(posedge clk or posedge reset) beginif(reset) beginvalid_o <= 0;img_data_o <= 0;end else if(valid_d1) beginif({last_line_data_d2, last_line_data_d1, last_line_data,cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd255}}) beginimg_data_o <= cur_line_data_d1;end else beginimg_data_o <= 0;   endvalid_o <= 1'b1;end else beginvalid_o <= 0;img_data_o <= 0;endendendmodule

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

1.相关定义 

2.fpga实现 

开运算:

闭运算 :

梯度运算:

module image_process_top(input wire clk,input wire reset,input wire [10:0] img_width,input wire [9:0] img_height,input wire valid_i,input wire [23:0] img_data_i,output wire valid_o,output wire [23:0] img_data_o);//参数定义wire rgb2gray_valid;wire [23:0] rgb2gray_data;wire binary_valid;wire [23:0] binary_data;wire line_valid;wire [23:0] last_line_data, cur_line_data, next_line_data;wire erode_valid;wire [23:0] erode_data;wire dilate_valid;wire [23:0] dilate_data;wire line1_valid;wire [23:0] last_line1_data, cur_line1_data, next_line1_data;//灰度化处理image_rgb2gray u_image_rgb2gray(.clk        ( clk        ),.reset      ( reset      ),.valid_i    ( valid_i    ),.img_data_i ( img_data_i ),.valid_o    ( rgb2gray_valid    ),.img_data_o  ( rgb2gray_data  ));//二值化处理image_binary u_image_binary(.clk        ( clk        ),.reset      ( reset      ),.valid_i    ( rgb2gray_valid    ),.img_data_i ( rgb2gray_data ),.valid_o    ( binary_valid    ),.img_data_o  ( binary_data  ));//开运算
/*//3行缓存image_line_buffer u_image_line_buffer(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( binary_valid ),.img_data_i     ( binary_data ),.valid_o        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data  ( next_line_data  ));//图像腐蚀image_erode u_image_erode(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( erode_valid    ),.img_data_o     ( erode_data     ));//3行缓存image_line_buffer u_image_line_buffer1(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( erode_valid ),.img_data_i     ( erode_data ),.valid_o        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data  ( next_line1_data  ));//图像膨胀image_dilate u_image_dilate(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data ( next_line1_data ),.valid_o        ( valid_o        ),.img_data_o     ( img_data_o     ));
*///闭运算
/*//3行缓存image_line_buffer u_image_line_buffer(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( binary_valid ),.img_data_i     ( binary_data ),.valid_o        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data  ( next_line_data  ));//图像膨胀image_dilate u_image_dilate(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( dilate_valid    ),.img_data_o     ( dilate_data     ));//3行缓存image_line_buffer u_image_line_buffer1(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( dilate_valid ),.img_data_i     ( dilate_data ),.valid_o        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data  ( next_line1_data  ));//图像腐蚀image_erode u_image_erode(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data ( next_line1_data ),.valid_o        ( valid_o        ),.img_data_o     ( img_data_o     ));
*///梯度运算//3行缓存image_line_buffer u_image_line_buffer(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( binary_valid ),.img_data_i     ( binary_data ),.valid_o        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data  ( next_line_data  ));//图像膨胀image_dilate u_image_dilate(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( dilate_valid    ),.img_data_o     ( dilate_data     ));//图像腐蚀image_erode u_image_erode(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( erode_valid    ),.img_data_o     ( erode_data     ));assign valid_o = dilate_valid;assign img_data_o = (dilate_data == 0)&&(erode_data == {3{8'd255}}) ? 0 : {3{8'd255}};endmodule

相关文章:

  • 智能手表整机装配作业指导书(SOP)
  • 贪吃蛇游戏排行榜模块开发总结:从数据到视觉的实现
  • AI 编程新时代!字节 Seed-Coder 重磅登场
  • 在Babylon.js中实现完美截图的艺术:包含Canvas和HTML覆盖层
  • 在Flutter上如何实现按钮的拖拽效果
  • SQL 索引优化指南:原理、知识点与实践案例
  • cocos creator 3.8 下的 2D 改动
  • C++的历史与发展
  • 特征偏移、标签偏移、数量偏移、概念漂移分别是什么?
  • 共享代理IP带宽受限影响大吗
  • 【经验总结】【乘法替换方法】
  • 无线定位之四 SX1302 网关源码 thread_jit 线程详解
  • Linux文件编程——标准库函数(fopen等)和系统调用函数(open等)的区别
  • 51c嵌入式~电路~合集27
  • 多目应用:三目相机在汽车智能驾驶领域的应用与技术创新
  • 基于智能家居项目 实现DHT11驱动源代码
  • Java——集合基础
  • 虹科干货 | CAN XL安全实践:深度防御下的密钥协商优化
  • AI+企业应用级PPT生成(实战)
  • 如何将两台虚拟机进行搭桥
  • 福州千余公共道路泊车位装“智能地锁”续:运营公司被责令改正并罚款
  • 体坛联播|安切洛蒂执掌巴西男足,字母哥尝试离开雄鹿
  • 苹果或将于2027年推出由玻璃制成的曲面iPhone
  • 中美经贸中方牵头人、国务院副总理何立峰出席新闻发布会表示:中美达成重要共识,会谈取得实质性进展
  • 人民日报读者点题·共同关注:今天我们为什么还需要图书馆?
  • 交涉之政、交涉之学与交涉文献——《近代中外交涉史料丛书》第二辑“总序”