【数字图像处理】边缘检测

边缘检测是一种图像处理技术,用于在图像中识别和提取物体边缘的信息,广泛应用于计算机视觉和图像分析领域。本文主要介绍数字图像边缘检测的基本原理,并记录在紫光同创 PGL22G FPGA 平台的布署与实现过程。

目录

1 边缘检测原理

2 FPGA 布署与实现

2.1 功能与指标定义

2.2 模块设计

2.3 上板调试


1 边缘检测原理

        边缘检测是一种数字图像处理技术,用于在图像中识别和提取物体边缘的信息,广泛应用于计算机视觉和图像分析领域。

        边缘检测的基本原理是利用图像中的亮度、颜色、纹理等差异,以及对象形状的不连续性,来检测图像中的边缘。常见的边缘检测算法包括 Prewitt、Sobel、Laplacian 等,这些算法可以生成一个边缘响应,图中每个像素点的值表示该位置周围边缘的强度。

        在边缘检测算法中,使用被称为算子的矩阵,例如 Prewitt 算子、Sobel 算子、Laplacian 算子等。算子在输入图像上移动时,重叠的区域进行卷积运算,得到输出图像上某个位置的响应。

Prewitt 算子

Prewitt_x = \begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{bmatrix}, Prewitt_y = \begin{bmatrix} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{bmatrix}

Sobel 算子

Sobel_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix}, Sobel_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix}

        Prewitt 边缘检测算法的优势在于它对噪声有一定的抑制作用,同时能够检测到图像中的水平和垂直边缘。然而,它对于其他方向的边缘检测效果较差。Sobel 检测算法对灰度渐变和噪声较多的边缘处理效果较好,但是对边缘的定位不够准确。

2 FPGA 布署与实现

2.1 功能与指标定义

        使用紫光同创 FPGA 平台实现边缘检测功能,FPGA 需要实现的功能与指标如下:

(1)与电脑的串口通信,用于接收上位机下发的图像数据,波特率为 256000 Bd/s;

(2)RGB 转灰度图处理,使用 3 个乘法器对接收到的图像进行灰度转换,用于后续的边缘检测;

(3)Prewitt 边缘检测,使用 FPGA 内部的 RAM 资源缓存 3 行图像数据,对 3 × 3 邻域内的数据进行 Prewitt 边缘检测;

(4)DDR3 读写控制,将处理前后的图像数据分别写入 DDR3 的不同区域,实现图像的拼接;

(5)HDMI 输出,输出一路 HDMI 信号源,用于将拼接后的图像显示在外接显示器上,分辨率为 1024×768。

2.2 模块设计

        边缘检测工程主要的设计模块层次与功能说明如下:

模块名称功能说明
top_uartuart_rx_slice串口接收驱动模块
uart_rx_parse串口数据解析模块,从上位机接收 8bit 原始图像,以及 Gamma 曲线数据
top_vidinvidin_pipelinepipeline 单元模块,缓存两行图像数据,并将数据提交到 ddr3 数据调度模块
vidin_pipeline_spipeline 单元简化模块,只缓存两行图像数据,无需产生与提交 ddr3 写命令
conv_rgb2grayRGB 转灰度图处理模块,使用乘法器进行灰度转换
conv_prewitt边缘检测模块,运用 Prewitt 算子对 3 × 3 领域内的数据进行处理
merge_outdvi_timing_genHDMI 视频时序产生模块
dvi_ddr_rd根据 HDMI 控制信号,提交读指令到 ddr3 数据调度模块
dvi_encoderHDMI 输出编码(8b10b 编码)与输出驱动模块

其中,conv_rgb2gray 模块实现灰度变换,conv_prewitt 模块实现边缘检测功能,conv_prewitt 实现水平边缘检测的思路为:

(1)对输入行数据进行打拍,得到 3 × 3 区域的数据;

(2)使用加法器电路,分别计算 3 × 3 区域内第 1 列、第 3 列的数据之和;

(3)使用比较器和减法器电路,计算第 1 列与第 3 列数据和的差。

对于垂直边缘检测,需要将列方向的数据求和,修改为行方向的数据求和。

conv_prewitt 模块代码如下:

`timescale 1 ns/ 1 psmodule conv_prewitt (input          reset,input          clock,input          load,input  [7:0]   ina,input  [7:0]   inb,input  [7:0]   inc,output [7:0]   edge_x,output [7:0]   edge_y
);// internal signal declarations
reg               load_r1;
reg               load_r2;
reg       [23:0]  pipeline_data1;
reg       [23:0]  pipeline_data2;
reg       [23:0]  pipeline_data3;reg       [15:0]  sum_of_col0;
reg       [15:0]  sum_of_col1;
reg       [15:0]  sum_of_col2;
reg       [15:0]  sum_of_row0;
reg       [15:0]  sum_of_row1;
reg       [15:0]  sum_of_row2;reg       [15:0]  buf_edge_x;
reg       [15:0]  buf_edge_y;// load 信号打两拍,用于边沿检测
always @(posedge reset or posedge clock) beginif (reset) beginload_r1 <= 1'b0;load_r2 <= 1'b0;endelse beginload_r1 <= load;load_r2 <= load_r1;end
end// 异步复位,同步复位
always @(posedge reset or posedge clock) beginif (reset) beginpipeline_data1 <= {3{8'h00}};pipeline_data2 <= {3{8'h00}};pipeline_data3 <= {3{8'h00}};endelse if (~load) beginpipeline_data1 <= {3{8'h00}};pipeline_data2 <= {3{8'h00}};pipeline_data3 <= {3{8'h00}};endelse beginpipeline_data1 <= {inc, inb, ina};pipeline_data2 <= pipeline_data1;pipeline_data3 <= pipeline_data2;end
end// 行、列求和
always @(posedge reset or posedge clock) beginif (reset) beginsum_of_col0 <= 16'd0;sum_of_col1 <= 16'd0;sum_of_col2 <= 16'd0;sum_of_row0 <= 16'd0;sum_of_row1 <= 16'd0;sum_of_row2 <= 16'd0;endelse beginsum_of_col0 <= pipeline_data1[0*8+:8] + pipeline_data1[1*8+:8] + pipeline_data1[2*8+:8];sum_of_col1 <= pipeline_data2[0*8+:8] + pipeline_data2[1*8+:8] + pipeline_data2[2*8+:8];sum_of_col2 <= pipeline_data3[0*8+:8] + pipeline_data3[1*8+:8] + pipeline_data3[2*8+:8];sum_of_row0 <= pipeline_data3[0*8+:8] + pipeline_data2[0*8+:8] + pipeline_data1[0*8+:8];sum_of_row1 <= pipeline_data3[1*8+:8] + pipeline_data2[1*8+:8] + pipeline_data1[1*8+:8];sum_of_row2 <= pipeline_data3[2*8+:8] + pipeline_data2[2*8+:8] + pipeline_data1[2*8+:8];end
endalways @(posedge reset or posedge clock) beginif (reset) beginbuf_edge_x <= 16'd0;buf_edge_y <= 16'd0;endelse beginif (sum_of_col2 >= sum_of_col0) buf_edge_x <= sum_of_col2 - sum_of_col0;else buf_edge_x <= sum_of_col0 - sum_of_col2;if (sum_of_row2 >= sum_of_row0) buf_edge_y <= sum_of_row2 - sum_of_row0;else buf_edge_y <= sum_of_row0 - sum_of_row2;end
endassign edge_x = buf_edge_x[0+:8];
assign edge_y = buf_edge_y[0+:8];endmodule

2.3 上板调试

        使用 PyQt5 和 OpenCV 库编写上位机程序,通过串口发送原始图像数据。连接 HDMI 线和串口线,选择与发送图像,就可以看到 FPGA 的处理效果了 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工具分享】| 阅读论文神器 使用技巧 AI润色 AI翻译

文章目录 1 使用技巧1.1 功能一 即时翻译1.2 功能二 文献跳转1.3 功能三 多设备阅读1.4 功能四 小组讨论笔记共享1.5 功能五 个人文献管理 2 其他功能 超级喜欢Readpaper这一款论文阅读软件&#xff0c;吹爆他哈哈 为什么&#xff1f; 当然是他可以解决我们传统阅读论文的种种…

数据库范式1NF-4NF

码和属性 字段是对内而言的&#xff0c;private的 属性是对外而言的&#xff0c;public的 用Java中的类比喻就是一个对像里面定义了很多字段&#xff0c;一般情况下每个字段都有一组对应的getter&setter方法&#xff0c;注意到了吗&#xff0c;字段一般用private修饰&#…

HarmonyOs 4 (一) 认识HarmonyOs

目录 一 HarmonyOs 背景1.1 发展时间线1.2 背景分析1.2.1 新场景1.2.2 新挑战1.2.3 鸿蒙生态迎接挑战 二 HarmonyOS简介2.1 OpenHarmony2.2 HarmonyOS Connect2.3 HarmonyOS Next**2.4 ArkTS &#xff08;重点掌握&#xff09;****2.5 ArkUI** 三 鸿蒙生态应用核心技术理念**3.…

探索APP自动化测试工具的重要作用是什么?

随着移动应用市场的蓬勃发展&#xff0c;保障应用程序的质量和性能成为开发团队至关重要的任务。在这个背景下&#xff0c;APP自动化测试工具崭露头角&#xff0c;成为提高开发效率、减少错误率的关键工具。本文将探讨APP自动化测试工具的用途&#xff0c;以及它们在移动应用开…

mongoDB非关系型数据库学习记录

一、简介 1.1Mongodb是什么 MongoDB是一个基于分布式文件存储的数据库,官方地址https://www.mongodb.com/ 1.2数据库是什么 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序 1.3数据库的作用 数据库的主要作用就是管理数据,对数据进行增©、删(d)、…

大语言模型(LLMs)在 Amazon SageMaker 上的动手实践(一)

本期文章&#xff0c;我们将通过三个动手实验从浅到深地解读和演示大语言模型&#xff08;LLMs&#xff09;&#xff0c;如何结合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等。 实验一&#xff1a;使用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器…

C语言错误处理之 “strerror和perror函数以及断言处理方式”

目录 前言 perror函数 strerror函数 断言处理方式 前言 在错误处理一中&#xff0c;我们解释了C语言三种处理方式中的错误号处理方式&#xff0c;这一篇我们在基于上一篇的基础上加入了strerror函数与perror函数&#xff0c;以及断言处理方式的内容...... perror函数 包…

VSCode下载安装教程+安装插件

一、vscode下载安装 1.打开 官网&#xff1a;https://code.visualstudio.com/Download 2.选择跟你电脑相对应的版本下载&#xff0c;我是win10&#xff0c;所以选择如下&#xff1a; 3.下载到你想要保存的目录下 4.下载完成后打开目录&#xff0c;双击安装包 5. 同意&#xff…

使用YOLOv8训练自己的数据集

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 拉取项目 git clone https://github.com/ultralytics/ultralytics安装依赖 cd ultralytics pip install -r requirement.txt pip instal…

【android开发-10】android中四种布局详细介绍

在Android开发中&#xff0c;常见的四种布局分别是&#xff1a;线性布局&#xff08;LinearLayout&#xff09;、相对布局&#xff08;RelativeLayout&#xff09;、帧布局&#xff08;FrameLayout&#xff09;和绝对布局&#xff08;AbsoluteLayout&#xff09;。 注意&#…

第16届中国R会议暨2023X-AGI大会开幕,和鲸科技分享ModelOps在数据科学平台中的实践与应用

11月25日&#xff0c;第 16 届中国 R 会议暨 2023 X-AGI 大会在在中国人民大学逸夫会堂拉开帷幕&#xff0c;本次会议由中国人民大学统计学院、中国人民大学应用统计科学研究中心、统计之都、原灵科技和中国商业统计学会人工智能分会&#xff08;筹&#xff09;主办&#xff0c…

React项目使用NProgress作为加载进度条

React项目使用NProgress作为加载进度条 0、效果1、react安装依赖2、使用3.进度条颜色设置 文档参考&#xff1a;https://zhuanlan.zhihu.com/p/616245086?utm_id0 0、效果 如下&#xff0c;可全局在页面顶部有一条进度条 1、react安装依赖 yarn add nprogress通过以上安装…

pytest自动化框架之allure测试报告的用例描述设置

allure测试报告的用例描述相关方法&#xff1b;如下图 allure标记用例级别severity 在做自动化测试的过程中&#xff0c;测试用例越来越多的时候&#xff0c;如果执行一轮测试发现了几个测试不通过&#xff0c;我们也希望能快速统计出缺陷的等级。 pytest结合allure框架可以对…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

oracle FUNCTION(任意两个时间 之间的工作小时)

写函数计算 任意两个时间 之间的工作小时 每天工作时间&#xff08;8:00 - 20:00 共12小时&#xff09;&#xff0c;没有休息日 CREATE OR REPLACE FUNCTION SC_YD_DESI.CALCULATE_WORK_HOURS_FUNC (p_current_time IN DATE,p_order_time IN DATE ) RETURN NUMBER ASp_work_hou…

AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 1 “建立开发环境”

这个系列的文章将叙述如何借由 NXP 的“evkmimxrt1060_aws_remote_control_wifi_nxp”这支 Sample Code&#xff0c;达到 NXP RT1060EVK 经由 U-Blox EVK-JODY-W263 将资讯传到 AWS 上&#xff0c;并可借由手机对 RT1060 EVK 的 LED 进行远端控制。 整体架构如下图所示&#x…

道可云会展元宇宙平台全新升级,打造3D沉浸式展会新模式

随着VR虚拟现实、人工智能、虚拟数字人等元宇宙技术的快速发展&#xff0c;各个行业正试图通过元宇宙技术寻求新的发展突破口&#xff0c;会展行业也不例外。会展作为经贸领域的重要产业形态&#xff0c;越来越多的企业和组织开始寻求通过元宇宙技术为展会赋能&#xff0c;以满…

【EI会议征稿】第七届大数据与应用统计国际学术研讨会(ISBDAS 2024)

第七届大数据与应用统计国际学术研讨会&#xff08;ISBDAS 2024&#xff09; 2024 7th International Symposium on Big Data and Applied Statistics 第七届大数据与应用统计国际学术研讨会&#xff08;ISBDAS 2024&#xff09;定于2024年3月8-10日在中国上海举行。会议旨在…

最小化安装 Neokylin7.0 用于搭建 Hadoop 集群

文章目录 环境搭建背景虚拟机创建和环境配置安装过程注意事项虚拟机设置软件选择KOUMP系统分区网络和主机名打开以太网&#xff0c;并记录信息配置 IPv4修改主机名 创建用户 hadoop完全分布式搭建-CSDN博客 环境搭建背景 为什么不从hadoop100或者hadoop101开始&#xff0c;而是…

STM32CubeMx+MATLAB Simulink点灯程序

STM32CubeMxMATLAB点灯程序 ✨要想实现在MATLAB Simulink环境下使用STM32&#xff0c;前提是已经搭建好MATLAB环境并且安装了必要的Simulink插件&#xff0c;以及对应的STM32支持包。 &#x1f33f;需要准备一块所安装支持包支持的STM32开发板. &#x1f516;具体支持包详情页…