基于EBAZ4205矿板的图像处理:09基于sobel边缘检测的图像锐化

基于EBAZ4205矿板的图像处理:09基于sobel边缘检测的图像锐化

项目全部文件

随后会上传项目全部文件

先看效果

在这里插入图片描述
请添加图片描述
锐化的有点过头了,不过我也懒得改了,想要改也很简单,无非就是给卷积运算后的结果加个系数,通过改系数调整加权的值。

算法简介

sobel边缘检测,实际上就是对g=f(x,y)这个函数求导,其中x和y是像素点的坐标,g是像素点的灰度值,求导嘛,就是找出像素随着位置变化的梯度,像素数值变化大的地方自然就是图像中的边缘、边界了。
sobel锐化就是将上述求导求出的梯度数值和卷积运算的滑动窗口的中心像素的灰度像素值加和,然后用加和结果替代中心像素的灰度像素值,当然这一加和的过程中,可以加上一个系数。这样我们就可以动态调整图像的锐化效果。

算法的FPGA部署

在这里插入图片描述
先是卷积乘法,然后把乘法的结果加在一起。再开方。开方的结果直接加在该卷积滑动窗口的中心像素点上。

项目代码

我会上传项目全部文件,这里就只粘贴部分关键代码了

图像锐化模块

`timescale 1ns / 1ps
module sobel_sharpper
((* X_INTERFACE_IGNORE = "true" *) input   wire                     clk             ,(* X_INTERFACE_IGNORE = "true" *) input   wire                     rst_n           ,(* X_INTERFACE_IGNORE = "true" *) input   wire                     matrix_img_vsync,(* X_INTERFACE_IGNORE = "true" *) input   wire                     matrix_img_href,//(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]       sobel_thresh          ,//8'd96(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p11,(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p12,(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p13,(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p21,(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p22,(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p23,(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p31,(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p32,(* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p33,(* X_INTERFACE_IGNORE = "true" *) input   wire                     matrix_frame_ce,(* X_INTERFACE_IGNORE = "true" *) output wire                      dataout_vsync  ,       //  processed Image data vsync valid signal(* X_INTERFACE_IGNORE = "true" *) output wire                      dataout_href   ,       //  processed Image data href vaild  signal(* X_INTERFACE_IGNORE = "true" *) output wire      [23:0]          dataout_gray ,          //  processed Image brightness output(* X_INTERFACE_IGNORE = "true" *) output wire                      dataout_frame_ce
);//----------------------------------------------------------------------
//            [p11,p12,p13]   [-1,0,1]
//  Gx_data = [p21,p22,p23] * [-2,0,2] = (p13+2*p23+p33) - (p11+2*p21+p31)
//            [p31,p32,p33]   [-1,0,1]
//
//            [p11,p12,p13]   [-1,-2,-1]
//  Gy_data = [p21,p22,p23] * [ 0, 0, 0] = (p31+2*p32+p33) - (p11+2*p12+p13)
//            [p31,p32,p33]   [ 1, 2, 1]
//  
//  G_data = sqrt(Gx_data^2 + Gy_data^2)
reg             [ 9:0]          Gx_data_tmp1;
reg             [ 9:0]          Gx_data_tmp2;
reg             [ 9:0]          Gy_data_tmp1;
reg             [ 9:0]          Gy_data_tmp2;
reg signed      [10:0]          Gx_data;
reg signed      [10:0]          Gy_data;
reg signed      [21:0]          Gx_square_data;
reg signed      [21:0]          Gy_square_data;
reg             [20:0]          G_square_data;
wire            [10:0]          G_data;always @(posedge clk)
beginGx_data_tmp1   <= matrix_p13 + {matrix_p23,1'b0} + matrix_p33;Gx_data_tmp2   <= matrix_p11 + {matrix_p21,1'b0} + matrix_p31;Gy_data_tmp1   <= matrix_p31 + {matrix_p32,1'b0} + matrix_p33;Gy_data_tmp2   <= matrix_p11 + {matrix_p12,1'b0} + matrix_p13;Gx_data        <= $signed({1'b0,Gx_data_tmp1}) - $signed({1'b0,Gx_data_tmp2});Gy_data        <= $signed({1'b0,Gy_data_tmp1}) - $signed({1'b0,Gy_data_tmp2});Gx_square_data <= $signed(Gx_data) * $signed(Gx_data);Gy_square_data <= $signed(Gy_data) * $signed(Gy_data);G_square_data  <= Gx_square_data[20:0] + Gy_square_data[20:0];
endsqrt u_sqrt
(.sys_clk    (clk            ),.sys_rst    (~rst_n         ),.din        (G_square_data  ),.din_valid  (1'b1           ),.dout       (G_data         ),.dout_valid (               )
);//----------------------------------------------------------------------
//  lag 16 clocks signal sync
reg             [15:0]           matrix_img_vsync_r1;
reg             [15:0]           matrix_img_href_r1;
reg             [15:0]           matrix_frame_ce_r1;always @(posedge clk or negedge rst_n)
beginif(!rst_n)beginmatrix_img_vsync_r1 <= 16'b0;matrix_img_href_r1  <= 16'b0;matrix_frame_ce_r1 <= 16'b0;endelsebeginmatrix_img_vsync_r1 <= {matrix_img_vsync_r1[14:0],matrix_img_vsync};matrix_img_href_r1  <= {matrix_img_href_r1[14:0],matrix_img_href};matrix_frame_ce_r1 <= {matrix_frame_ce_r1[14:0],matrix_frame_ce};end
endreg             [7:0]           matrix_p22_r1       [0:15];always @(posedge clk)
beginmatrix_p22_r1[ 0] <= matrix_p22;matrix_p22_r1[ 1] <= matrix_p22_r1[ 0];matrix_p22_r1[ 2] <= matrix_p22_r1[ 1];matrix_p22_r1[ 3] <= matrix_p22_r1[ 2];matrix_p22_r1[ 4] <= matrix_p22_r1[ 3];matrix_p22_r1[ 5] <= matrix_p22_r1[ 4];matrix_p22_r1[ 6] <= matrix_p22_r1[ 5];matrix_p22_r1[ 7] <= matrix_p22_r1[ 6];matrix_p22_r1[ 8] <= matrix_p22_r1[ 7];matrix_p22_r1[ 9] <= matrix_p22_r1[ 8];matrix_p22_r1[10] <= matrix_p22_r1[ 9];matrix_p22_r1[11] <= matrix_p22_r1[10];matrix_p22_r1[12] <= matrix_p22_r1[11];matrix_p22_r1[13] <= matrix_p22_r1[12];matrix_p22_r1[14] <= matrix_p22_r1[13];matrix_p22_r1[15] <= matrix_p22_r1[14];
end//----------------------------------------------------------------------
reg             [11:0]          pixel_data1;always @(posedge clk or negedge rst_n)
beginif(!rst_n)pixel_data1 <= matrix_p22_r1[15];elsepixel_data1 <= matrix_p22_r1[15] + G_data;
endreg             [7:0]           pixel_data2;always @(posedge clk)
beginif(pixel_data1 > 12'd255)pixel_data2 <= 8'd255;elsepixel_data2 <= pixel_data1[7:0];
end//----------------------------------------------------------------------
//  lag 2 clocks signal sync
reg             [1:0]           matrix_img_vsync_r2;
reg             [1:0]           matrix_img_href_r2;
reg             [1:0]           matrix_frame_ce_r2;always @(posedge clk or negedge rst_n)
beginif(!rst_n)beginmatrix_img_vsync_r2 <= 2'b0;matrix_img_href_r2  <= 2'b0;matrix_frame_ce_r2  <= 2'b0;endelsebeginmatrix_img_vsync_r2 <= {matrix_img_vsync_r2[0],matrix_img_vsync_r1[15]};matrix_img_href_r2  <= {matrix_img_href_r2[0],matrix_img_href_r1[15]};matrix_frame_ce_r2  <= {matrix_frame_ce_r2[0],matrix_frame_ce_r1[15]};end
end//----------------------------------------------------------------------
//  result output
assign dataout_gray  = {3{pixel_data2}};
assign dataout_vsync = matrix_img_vsync_r2[1];
assign dataout_href  = matrix_img_href_r2[1];
assign dataout_frame_ce    = matrix_frame_ce_r2[1];endmodule

vitis代码

//作者:抢公主的大魔王
//功能:图像sobel锐化
//日期:24.5.24
//版本:1v0
//联系方式:2376635586@qq.com
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xplatform_info.h"
#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "display_ctrl_hdmi/display_ctrl.h"
#include "vdma_api/vdma_api.h"
#include "emio_sccb_cfg/emio_sccb_cfg.h"
#include "ov5640/ov5640_init.h"
#include "sleep.h"
#include "xuartps.h"
#include "string.h"//宏定义
#define DYNCLK_BASEADDR  	XPAR_AXI_DYNCLK_0_BASEADDR  //动态时钟基地址
#define VDMA_ID          	XPAR_AXIVDMA_0_DEVICE_ID    //VDMA器件ID
#define DISP_VTC_ID      	XPAR_VTC_0_DEVICE_ID        //VTC器件ID
#define UART_DEVICE_ID     XPAR_PS7_UART_0_DEVICE_ID    //串口设备ID
#define UART_INT_IRQ_ID    XPAR_XUARTPS_0_INTR          //串口中断ID
//#define THRESHOLD_BASEADDR 	XPAR_AXICTRLTHRESHOLD_0_S00_AXI_BASEADDR#define EMIO_SCL_NUM 54
#define EMIO_SDA_NUM 55
#define KEY1 56 //T19
#define KEY2 57 //P19
#define KEY3 58 //U20
#define KEY4 59 //U19
#define KEY5 60 //V20
#define LED1 61 //H18
#define LED2 62 //K17
#define LED3 63 //E19#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs Gpio;
#define GPIO_BANK	XGPIOPS_BANK0  /* Bank 0 of the GPIO Device */
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
#define GPIO_INTERRUPT_ID	XPAR_XGPIOPS_0_INTR//全局变量
//frame buffer的起始地址
unsigned int const frame_buffer_addr = (XPAR_PS7_DDR_0_S_AXI_BASEADDR+ 0x1000000);
//u8 binary_threshold = 128;
//u8 sobel_threshold = 153;XAxiVdma     vdma;
DisplayCtrl  dispCtrl;
VideoMode    vd_mode;void Gpio_Init(void){XGpioPs_Config *ConfigPtr;ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);XGpioPs_SetDirectionPin(&Gpio, LED1, 1);XGpioPs_SetOutputEnablePin(&Gpio, LED1, 1);XGpioPs_WritePin(&Gpio, LED1, 0);}int main(void)
{u32 status;u16 cmos_h_pixel;                    //ov5640 DVP 输出水平像素点数u16 cmos_v_pixel;                    //ov5640 DVP 输出垂直像素点数u16 total_h_pixel;                   //ov5640 水平总像素大小u16 total_v_pixel;                   //ov5640 垂直总像素大小cmos_h_pixel = 1280;cmos_v_pixel = 720;total_h_pixel = 2570;total_v_pixel = 980;emio_init();//控制hdmi的emio初始化//xil_printf("Uart and Key is init successful! \r\n");//xil_printf("ov5640 is initing! \r\n");status = ov5640_init( cmos_h_pixel,  //初始化ov5640cmos_v_pixel,total_h_pixel,total_v_pixel);//设置OV5640输出分辨率为1280*720  PCLK = 72Mhzif(status == 0);//xil_printf("OV5640 init successful!\r\n");elsexil_printf("OV5640 detected failed!\r\n");xil_printf("Uart and OV5640 is init successful! \r\n\r\n");sleep(1);vd_mode = VMODE_1280x720;//配置VDMArun_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,frame_buffer_addr,0,0,BOTH);//初始化Display controllerDisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);//设置VideoModeDisplaySetMode(&dispCtrl, &vd_mode);DisplayStart(&dispCtrl);Gpio_Init();//按键和led的初始化//Xil_Out32(THRESHOLD_BASEADDR, binary_threshold);//Xil_Out32(THRESHOLD_BASEADDR+4, sobel_threshold);while(1){XGpioPs_WritePin(&Gpio, LED1, !XGpioPs_ReadPin(&Gpio, LED3));sleep(1);}return 0;
}

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

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

相关文章

【数据分析】Numpy和Pandas库基本用法及实例--基于Japyter notebook实现

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 承接上篇的博客 数据分析—技术栈和开发环境搭…

家政预约小程序03分类管理

目录 1 创建数据源2 搭建导航菜单3 搭建小程序4 设置变量5 变量绑定总结 家政预约小程序里&#xff0c;在首页需要展示家政可以开展的各类业务。我们把业务按照类别进行划分&#xff0c;本篇我们介绍一下管理后台的维护功能以及小程序的展示功能。 1 创建数据源 为了管理和展示…

2024年二建准考证打印入口已开通!

24年二建将于6月1日、2日举行&#xff0c;目前西藏、陕西准考证打印入口已开通&#xff0c;各省也将陆续开始准考证打印工作。 2024二建考试时间安排 2024二建准考证打印时间 二建准考证打印须知 01 准考证打印信息显示空白怎么办? 1)使用电脑自带的浏览器重新试一下。 2)…

Qt 报错总结 No suitable kits found

目录 “No suitable kits found” 解决 解决方法参考&#xff1a; chatGPT辅助解决QT构建报错error: multiple target patterns 我的解决方法&#xff1a;把语言设置为空 “No suitable kits found” 解决 没有找到合适的kits套件&#xff0c;在安装Qt Creator时没有安装Min…

高阶路由过渡处理方案 —— 浏览器堆栈主动介入

目录 01: 前言 02: VueRouter 过渡动效可行性分析 03: 主动介入浏览器堆栈管理&#xff0c;分析可行性方案 04: 主动介入浏览器堆栈管理 05: 基于 GSAP 实现高阶路由过渡动画分析 06: 基于 GSAP 实现高阶路由过渡动画处理 07: 通用组件&#xff1a;navbar 构建方案分析…

Redis基础篇

文章目录 2 Redis入门概述3 Redis10大数据类型3.1 Redis自字符串String3.2 Redis列表List3.3 Redis哈希Hash3.4 Redis集合Set3.5 Redis有序集合Sorted Set3.6 Redis地理空间 GEO3.7 Redis基数统计 HyperLogLog3.8 Redis位图bitmap3.9 Redis位域bitField3.10 Redis流Stream 4 Re…

Elasticsearch 分析器的高级用法一(同义词,高亮搜索)

Elasticsearch 分析器的高级用法一&#xff08;同义词&#xff0c;高亮搜索&#xff09; 同义词简介分析使用同义词案例 高亮搜索高亮搜索策略unifiedplainvh 同义词 简介 在搜索场景中&#xff0c;同义词用来处理不同的查询词&#xff0c;有可能是想表达相同的搜索目标。 例…

基于Go实现的分布式主键系统

基于Go实现的分布式主键系统 摘要 随着互联网的发展&#xff0c;微服务得到了快速的发展&#xff0c;在微服务架构下&#xff0c;分布式主键开始变得越来越重要。目前分布式主键的实现方式颇多&#xff0c;有基于数据库自增的、基于UUID的、基于Redis自增的、基于数据库号段的…

探寻最强性能云电脑:ToDesk云电脑、无影云、网易云游戏、易腾云横测大比拼

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

恶劣天候鲁棒三维目标检测论文整理

恶劣天候鲁棒三维目标检测论文整理 Sunshine to Rainstorm: Cross-Weather Knowledge Distillation for Robust 3D Object DetectionRobo3D: Towards Robust and Reliable 3D Perception against CorruptionsLossDistillNet: 3D Object Detection in Point Cloud Under Harsh W…

基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 ADRC原理 4.2 线性误差反馈控制律(LSEF) 4.3 ADRC-LSEF融合系统 5.完整工程文件 1.课题概述 基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真。 2.系统仿真结果 …

测试驱动编程(3)进阶单元测试(下)

文章目录 测试驱动编程(3)进阶单元测试&#xff08;下&#xff09;示例实战接收同事的需求开始迭代需求故事迭代1故事迭代2故事迭代3故事迭代4故事迭代5故事迭代6 测试驱动编程(3)进阶单元测试&#xff08;下&#xff09; 示例实战 接收同事的需求 你的同事正在开发一个远程…

【PROXYCHAINS】Kali Linux 上配置NAT PROXYCHAINS保姆级教程

kali linux配置agent 在博主配置kali 的时候遇到了一些小问题&#xff0c;主要就是连接一直报错超时。 方法一&#xff1a;优点&#xff1a;免费&#xff0c;但是agent很不稳定 搜索免费ip,在Google搜索free proxy list 检查可用ip 连接成功 cd /etcls |grep redsnano reds…

IDEA中一些常见操作【持续更新】

文章目录 前言善用debugidea中debug按钮不显示自动定位文件【始终选择打开的文件】idea注释不顶格【不在行首】快速定位类的位置【找文件非常快】创建文件添加作者及时间信息快速跳转到文件顶端 底端 前言 因为这些操作偶尔操作一次&#xff0c;不用刻意记忆&#xff0c;有个印…

苹果CMS:怎么重新安装

当我们安装好苹果CMS之后苹果cms&#xff1a;介绍及安装&#xff0c;但是最好我们在安装的时候配置好对应配置后&#xff0c;备份一份&#xff0c;如果不记得哪里配置出了问题&#xff0c;出现一些不可预料的问题&#xff0c;那我们可以简单暴力的直接重新安装&#xff0c;我们…

211初试自命题复试线仅302分!延边大学计算机考研考情分析!

延边大学&#xff08;Yanbian University&#xff09;&#xff0c;简称“延大”&#xff0c;地处吉林省延边朝鲜族自治州&#xff0c;是国家“双一流”建设高校、国家“211工程”重点建设大学、西部开发重点建设院校、吉林省人民政府和教育部共同重点支持建设大学、吉林省人民政…

计算机如何将输入文字显示出来的?渲染Image rendering

1.文字渲染的简单理解 渲染图像&#xff0c;可以理解为用cpu/gpu构造出原本不存在的图像。比如输入计算机的英文字符都是ASCII码&#xff0c;而我们在屏幕上看到显示的字符对应的应该是RGB/YUV的像素。计算机把ASCII字符转化成像素的过程就是文字渲染。又比如我们GPU用多个2D图…

DolphinDB 携手九鞅科技,助力固收投研效能飞跃

随着金融市场开放的广度与深度不断拓宽&#xff0c;金融产品呈现出多样化的发展态势&#xff0c;其中债券投资组合凭借其低风险性、高流动性与稳健的收益表现&#xff0c;逐渐成为投资理财领域备受瞩目的焦点。投资经理不仅需要了解哪些债券值得投资&#xff0c;更要对债券投资…

web4.0-元宇宙虚拟现实

互联网一直在不断演变和改变我们的生活方式&#xff0c;从Web逐渐 1.0时代的静态网页到Web 2.0时代的社会性和内容制作&#xff0c;再从Web逐渐 在3.0阶段&#xff0c;互联网发展一直推动着大家时代的发展。如今&#xff0c;大家正站在互联网演化的新起点上&#xff0c;迈入Web…

微信hook协议3.84最新版

PC微信接口使用说明 用户故事 更新日志 登录与退出 获取进程端口占用信息 获取微信进程总数 启动微信 点击登陆微信 刷新并获取登录二维码 获取登录二维码数据(可以不调用) 获取微信登陆状态 退出微信 结束微信 个人信息管理 获取个人详细信息 保存收款码 获取本人地址 修改本人…