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

news2024/11/17 21:18:18

基于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)
begin
    Gx_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];
end

sqrt 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)
begin
    if(!rst_n)
    begin
        matrix_img_vsync_r1 <= 16'b0;
        matrix_img_href_r1  <= 16'b0;
        matrix_frame_ce_r1 <= 16'b0;
    end
    else
    begin
        matrix_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
end

reg             [7:0]           matrix_p22_r1       [0:15];

always @(posedge clk)
begin
    matrix_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)
begin
    if(!rst_n)
        pixel_data1 <= matrix_p22_r1[15];
    else
        pixel_data1 <= matrix_p22_r1[15] + G_data;
end

reg             [7:0]           pixel_data2;

always @(posedge clk)
begin
    if(pixel_data1 > 12'd255)
        pixel_data2 <= 8'd255;
    else
        pixel_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)
begin
    if(!rst_n)
    begin
        matrix_img_vsync_r2 <= 2'b0;
        matrix_img_href_r2  <= 2'b0;
        matrix_frame_ce_r2  <= 2'b0;
    end
    else
    begin
        matrix_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,  //初始化ov5640
						  cmos_v_pixel,
						 total_h_pixel,
						 total_v_pixel);//设置OV5640输出分辨率为1280*720  PCLK = 72Mhz
	if(status == 0)
		;
		//xil_printf("OV5640 init successful!\r\n");
	else
		xil_printf("OV5640 detected failed!\r\n");
	xil_printf("Uart and OV5640 is init successful! \r\n\r\n");
	sleep(1);
	vd_mode = VMODE_1280x720;

	//配置VDMA
	run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,
							frame_buffer_addr,0,0,BOTH);
    //初始化Display controller
	DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);
    //设置VideoMode
	DisplaySetMode(&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.coloradmin.cn/o/1687846.html

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

相关文章

学习Uni-app开发小程序Day17

今天开始&#xff0c;就把uni-app前期使用的全部学完了&#xff0c;现在就把以前学习的&#xff0c;做成一案例&#xff0c;中间有未讲的&#xff0c;在进行补充&#xff0c;这里是根据老师视频进行项目案例编写的。 先弄出效果图&#xff0c;然后在根据效果图进行代码的编辑 …

Android:使用Kotlin搭建MVP架构模式

一、简介Android MVP架构模式 MVP全称&#xff1a;Model、View、Presenter&#xff1b; View&#xff1a;负责视图部分展示Model&#xff1a;负责数据的请求、解析、过滤等数据层操作。Presenter&#xff1a;View和Model交互的桥梁。对应MVC中的C&#xff08;controller&#x…

AJAX(JQuery版本)

目录 前言 一.load方法 1.1load()简介 1.2load()方法示例 1.3load()方法回调函数的参数 二.$.get()方法 2.1$.get()方法介绍 2.2详细说明 2.3一些例子 2.3.1请求test.php网页并传送两个参数 2.3.2显示test返回值 三.$.post()方法 3.1$.post()方法介绍 3.2详细说明 …

Debug-010-git stash的用法及使用场景

问题原因&#xff1a; 其实也不是最近&#xff0c;就是之前就碰到过这个问题&#xff0c;那就是我正在新分支开发新功能&#xff0c;开发程度还没有到可以commit的程度&#xff0c;我不想提交(因为有些功能没有完全实现&#xff0c;而且没有自测的话很容易有问题&#xff0c;提…

【C++初阶】—— 类和对象 (下)

&#x1f4dd;个人主页&#x1f339;&#xff1a;EterNity_TiMe_ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 类和对象 1. 运算符重载运算符重载赋值运算符重载前置和后置重载 2. 成员函数的补充3. 初始化列…

Python 调整PDF文件的页面大小

在处理PDF文件时&#xff0c;我们可能会遇到这样的情况&#xff1a;原始PDF文档不符合我们的阅读习惯&#xff0c;或者需要适配不同显示设备等。这时&#xff0c;我们就需要及时调整PDF文档中的页面尺寸&#xff0c;以满足不同应用场景的需求。 利用Python语言的高效性和灵活性…

SOLIDWORKS二次开发服务商 慧德敏学

SOLIDWORKS是一套三维设计软件, 采用特征建模、变量化驱动可方便地实现三维建模、装配和生成工程图。SOLIDWORKS软件本身所具有的交互方式, 可以使用户对已生成模型的尺寸、几何轮廓和相互约束关系随时进行修改, 而不需要编程。但要实现设计意义上的变量化绘图和系列化设计, 需…

89.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-游戏中使用的哈希算法逆向分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

4K高刷显示器 - 10大产品对比

4K高刷显示器 - 蚂蚁电竞 N27U 显示屏评测报告 一、产品品牌知名度 蚂蚁电竞&#xff0c;作为一家专注于电竞领域的品牌&#xff0c;近年来在市场上逐渐崭露头角。虽然相较于一些老牌显示器品牌&#xff0c;蚂蚁电竞的知名度还有待提高&#xff0c;但其在电竞领域的表现却不容…

C++数据结构——哈希表

前言&#xff1a;本篇文章将继续进行C数据结构的讲解——哈希表。 目录 一.哈希表概念 二.哈希函数 1.除留取余法 三.哈希冲突 1.闭散列 线性探测 &#xff08;1&#xff09;插入 &#xff08;2&#xff09;删除 2. 开散列 开散列概念 四.闭散列哈希表 1.基本框架 …

Excel实现将A列和B列的内容组合到一个新的列(例如C列)中,其中A列的每个值都与B列的所有值组合。

利用Excel中vba代码宏实现 原始数据&#xff1a; 自动生成后数据&#xff1a; vba实现代码&#xff1a; Sub CombineColumns()Dim ws As WorksheetDim lastRowA As Long, lastRowB As Long, i As Long, j As LongDim MyIndex As IntegerDim strCombine As String, strColA As…

Vue 3 组件基础与模板语法详解

title: Vue 3 组件基础与模板语法详解 date: 2024/5/24 16:31:13 updated: 2024/5/24 16:31:13 categories: 前端开发 tags: Vue3特性CompositionAPITeleportSuspenseVue3安装组件基础模板语法 Vue 3 简介 1. Vue 3 的新特性 Vue 3引入了许多新的特性&#xff0c;以提高框…

【计算机视觉(3)】

基于Python的OpenCV基础入门——图形与文字的绘制 图形与文字的绘制&#xff1a;画线画矩形画圆画多边形加文字 图形与文字绘制的代码实现&#xff1a; 图形与文字的绘制&#xff1a; 画线 img cv2.line(img, pt1, pt2, color, thickness) 参数&#xff1a; img&#xff1a;…

瑞芯微RV1126——ffmpeg环境搭建

本篇文章来介绍一下&#xff0c;在ubuntu上搭建一个比较完整的ffmpeg环境需要的步骤以及流程。为后期将我们开发的应用程序移植到RV1126开发板上做准备。 在安装ffmpeg之前&#xff0c;为了方便后续的操作&#xff0c;我们可以先搭建好samba服务器。所以本节将分为两个部分&am…

ThingML的学习——在ecplise里面配置maven

前置工作&#xff1a; 1.在ecplise里面配置maven之前&#xff0c;首先需要在windows里面下载maven。 2.配置环境变量 3.修改maven配置文件&#xff08;最好改为阿里云&#xff09; 1.配置Java环境&#xff0c;需要jdk版的&#xff08;jar不行&#xff09; 以上不在这里面详细介…

ACM实训第十七天

Is It A Tree? 问题 考试时应该做不出来&#xff0c;果断放弃 树是一种众所周知的数据结构&#xff0c;它要么是空的(null, void, nothing)&#xff0c;要么是一个或的集合满足以下属性的节点之间有向边连接的节点较多。 •只有一个节点&#xff0c;称为根节点&#xff0c;它…

探索生态农业,守护绿色家园

在繁忙的都市生活中&#xff0c;我们往往忽略了与自然和谐相处的重要性。而生态农业&#xff0c;正是让我们重拾与大自然亲密关系的桥梁。通过采用生态友好的耕作方式&#xff0c;生态农业不仅能够提供健康、营养的农产品&#xff0c;还能够保护生态环境&#xff0c;实现人与自…

登录安全分析报告:创蓝云智注册

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

ubuntu使用记录——如何使用wireshark网络抓包工具进行检测速腾激光雷达的ip和端口号

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言wireshark网络抓包工具1.wireshark的安装2.wireshark的使用3.更改雷达ip 总结 前言 Wireshark是一款备受赞誉的开源网络协议分析软件&#xff0c;其功能之强大…