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

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

http://www.xdnf.cn/news/5890.html

相关文章:

  • 【图像处理基石】遥感图像分析入门
  • stm32f103rct6中使用串口1 DMA通信程序含异常处理
  • 数据验证库pydantic的用法
  • 力扣热题——统计平衡排列的数目
  • 进程间通信分类
  • 数组练习题
  • 采购流程规范化如何实现?日事清流程自动化助力需求、采购、财务高效协作
  • 动态查找滚动容器(通用方案)
  • 故障诊断模型评估——混淆矩阵,如何使样本量一致(上)
  • 深入浅出之STL源码分析8_三个指针
  • PostgreSQL 恢复信息函数
  • Android Exoplayer多路不同时长音视频混合播放
  • window 显示驱动开发-报告图形内存(一)
  • ElasticSeach快速上手笔记-入门篇
  • VScode 的插件本地更改后怎么生效
  • 嵌入式学习--江协51单片机day5
  • React百日学习计划——Deepseek版
  • 销量预测评估指标
  • 【工作记录】Kong Gateway 入门篇之部署及简单测试
  • mpegts.js 播放flv视频报错:PIPELINE_ERROR_DECODE: video decode error!
  • FlashInfer - 安装
  • 理解 Open vSwitch (OVS)
  • 一键转换上百文件 Word 批量转 PDF 软件批量工具
  • 大模型——Crawl4AI为 LLM 和 RAG 准备高质量网页数据
  • ‌Element UI 双击事件(@cell-dblclick 与 @row-dblclick)
  • 函数式方法的实现(JDK8+)
  • 洛谷 P3374 【模板】树状数组 1(树状数组解法)
  • C#高级编程:设计模式原则
  • 第28节:现代CNN架构-ResNet与残差连接
  • Android加固工具测评:易盾、顶象、360加固哪款更好用?