10.图像高斯滤波的原理与FPGA实现思路

1.概念

高斯分布
图像滤波之高斯滤波介绍
图像处理算法|高斯滤波
  高斯滤波(Gaussian filter)包含很多种,包括低通、高通、带通等,在图像上说的高斯滤波通常是指的高斯模糊(Gaussian Blur),是一种高斯低通滤波。通常这个算法也可以用来模糊图像,提供模糊滤镜。也可以用来过滤自然界的高斯白噪声。
  高斯分布(正态分布)是一个常见的连续概率分布,正态分布的数学期望值或期望值 μ \mu μ等于位置参数,决定了分布的位置,其方差 σ 2 \sigma^2 σ2的开平方或者标准差 σ \sigma σ等于尺度参数,决定了分布的幅度。正态分布的概率密度函数曲线呈钟形,所以又被称为钟形曲线。我们常说的标准正态分布是位置参数 μ = 0 , 方差 σ 2 = 1 \mu=0,方差\sigma^2=1 μ=0,方差σ2=1的正态分布
  若随机变量 X X X服从一个位置参数为 μ 、方差为 σ 2 \mu、方差为\sigma^2 μ、方差为σ2的正态分布,可以记为 X N ( μ , σ 2 ) X~N(\mu,\sigma^2) X N(μ,σ2),其概率密度函数为:
g ( x ) = 1 2 π σ e ( − ( x − μ ) 2 2 σ 2 ) (1) g(x)=\frac{1} {\sqrt{2\pi} \sigma }e^{(-\frac{{(x-\mu)}^{2} }{2\sigma^{2}})}\tag{1} g(x)=2π σ1e(2σ2(xμ)2)(1)
  高斯滤波器是一种根据高斯函数的形状来选择权值的线性平滑滤波器,对于抑制服从正态分布的噪声非常有效,一维零均值高斯函数为:
g ( x ) = 1 2 π σ e − x 2 2 σ 2 (2) g(x)=\frac{1} {\sqrt{2\pi} \sigma }e^{-\frac{x^{2} }{2\sigma^{2}}}\tag{2} g(x)=2π σ1e2σ2x2(2).
  其中,高斯分布参数( σ \sigma σ)决定了高斯函数的宽度,一维高斯函数的图形如下图:
在这里插入图片描述
  二维高斯高斯分布的函数为:
g ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 (3) g(x,y)=\frac{1}{2\pi\sigma^2}e^{\frac{-x^2+y^2}{2\sigma^2}}\tag{3} g(x,y)=2πσ21e2σ2x2+y2(3)
  二维高斯分布的图像为:
在这里插入图片描述

2.高斯滤波性质

  高斯函数具有五个重要的性质,这些性质使得它在早期图像处理中特别有用.这些性质表明,高斯平滑滤波器无论在空间域还是在频率域都是十分有效的低通滤波器,且在实际图像处理中得到了工程人员的有效使用.高斯函数具有五个十分重要的性质,它们是:
  1.二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的.一般来说,一幅图像的边缘方向是事先不知道的,因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑.旋转对称性意味着高斯平滑滤波器在后续边缘检测中不会偏向任一方向.
  2.高斯函数是单值函数.这表明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的.这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真.
  3.高斯函数的傅立叶变换频谱是单瓣的.正如下面所示,这一性质是高斯函数付立叶变换等于高斯函数本身这一事实的直接推论.图像常被不希望的高频信号所污染(噪声和细纹理).而所希望的图像特征(如边缘),既含有低频分量,又含有高频分量.高斯函数付立叶变换的单瓣意味着平滑图像不会被不需要的高频信号所污染,同时保留了大部分所需信号.
  4.高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好.通过调节平滑程度参数σ,可在图像特征过分模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(欠平滑)之间取得折衷.
  5.由于高斯函数的可分离性,较大尺寸的高斯滤波器可以得以有效地实现.二维高斯函数卷积可以分两步来进行,首先将图像与一维高斯函数进行卷积,然后将卷积结果与方向垂直的相同一维高斯函数卷积.因此,二维高斯滤波的计算量随滤波模板宽度成线性增长而不是成平方增长.

3.高斯滤波的原理与实现

3.1 高斯模板的生成

  高斯滤波既能用来过滤高斯噪音,也可用来做高斯模糊。
  要模糊一张图像,可以直接用均值滤波来做简单的模糊,但是这样做显然不大合理,因为图像是连续的,离卷积核中心的点关系更加密切,越远的点关系越疏远,这个时候就需要加权平均。明显的离中心点越近的像素点权重越大。而正态分布显然是一种可取的权重分配方式,又由于图像是二维的,所以需要使用二维的高斯函数。所以高斯滤波的本质是利用高斯函数来生成高斯核(高斯卷积模板)来对图像进行卷积操作。
  理论上高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核,但是实际上,仅需要取均值的三倍标准差(即 3 σ 3\sigma 3σ)内的值,以外的部分去掉即可。
  高斯滤波最重要的就是找到高斯模板然后进行卷积,以3X3高斯模板为例,假设中心点的坐标为(0,0),根据二维高斯函数 g ( x , y ) g(x,y) g(x,y),还需要设定 σ \sigma σ的值,假定 σ = 0.8 \sigma=0.8 σ=0.8(这个值不宜过大,否则就会变成均值滤波),可以根据坐标值来算出对应的高斯模板。
  假定中心点的坐标为(0,0),那么距离它最近的八个点的坐标如下:
在这里插入图片描述
  将坐标以及设定的 σ \sigma σ带入二维高斯函数中,可以得到对应点的坐标的权重如下:
在这里插入图片描述

  为了防止高斯滤波后的图像偏亮或者偏暗,我们还需要对图像进行归一化,这九个点的权重和等于0.9125991,因此需要分别对这九个数除以0.9125991,最终得到的高斯模板为:
在这里插入图片描述
  有了高斯模板就可以对图像进行卷积了,但是在FPGA中对于小数的运算不友好,于是我们将这个3X3模板扩大了16倍,得到了近似的整数模板,卷积完成后再除以16来做定浮点数的近似计算。16倍后的模板高斯卷积模板为:
在这里插入图片描述
  3X3的高斯模板生成与定浮点数的MATLAB算法实现为:

clear;
clc;
close all;
sigma = 0.8 ;
A = exp(-(1+1)/(2*sigma*sigma))/(2*pi*sigma*sigma);
B = exp(-(1+0)/(2*sigma*sigma))/(2*pi*sigma*sigma);
C = exp(-(0+0)/(2*sigma*sigma))/(2*pi*sigma*sigma);
D = A*4 + B*4 + C;gauss_double = [A,B,A;B,C,B;A,B,A];
gauss_normal = gauss_double / sum(sum(gauss_double));
gauss_integer = floor(gauss_normal/gauss_normal(1,1));

3.2 高斯算法的FPGA实现

  生成卷积模板后的FPGA实现与仿真参考前面几章,这里只贴高斯算法的FPGA实现部分:

module gassin_filter#(parameter DW = 8
)(input   wire                clk         		,input   wire                rst_n       		,input   wire                matrix_de   		,input   wire    [DW-1:0]    matrix11    		,input   wire    [DW-1:0]    matrix12    		,input   wire    [DW-1:0]    matrix13    		,input   wire    [DW-1:0]    matrix21    		,input   wire    [DW-1:0]    matrix22    		,input   wire    [DW-1:0]    matrix23    		,input   wire    [DW-1:0]    matrix31    		,input   wire    [DW-1:0]    matrix32    		,input   wire    [DW-1:0]    matrix33    		,output  wire                gassin_data_de 	    ,output  wire    [DW-1:0]    gassin_data 
);//gassin_filter
//  [1      2       1]
//  [2      4       2]
//  [1      2       1]
reg     [1:0]           matrix_de_r ;reg     [DW+2:0]        one_line    ;
reg     [DW+2:0]        two_line    ;
reg     [DW+2:0]        three_line  ;
reg     [DW+4:0]        sum_matrix  ;always @(posedge clk)beginif(rst_n == 0)beginmatrix_de_r     <=  0;end else beginmatrix_de_r     <=  {matrix_de_r[0],matrix_de};end
end always @(posedge clk)beginif(rst_n==0)beginone_line    <=  0   ;two_line    <=  0   ;three_line  <=  0   ;end else if(matrix_de)beginone_line    <=  matrix11    +   2*matrix12  +   matrix13    ;two_line    <=  2*matrix21  +   4*matrix22  +   2*matrix23  ;three_line  <=  matrix31    +   2*matrix32  +   matrix33    ;endelse beginone_line    <=  0   ;two_line    <=  0   ;three_line  <=  0   ;end  
end always @(posedge clk)beginif(rst_n == 0)beginsum_matrix  <=  0;end else if(matrix_de_r[0])beginsum_matrix  <=  one_line + two_line + three_line ;endelse beginsum_matrix  <=  0;end
endassign  gassin_data     =   sum_matrix[DW+4:4]  ;
assign  gassin_data_de  =   matrix_de_r[1]      ;endmodule

3.3 高斯算法的MATLAB实现以及验证

clear;
clc;
close all;
sigma = 0.8 ;
A = exp(-(1+1)/(2*sigma*sigma))/(2*pi*sigma*sigma);
B = exp(-(1+0)/(2*sigma*sigma))/(2*pi*sigma*sigma);
C = exp(-(0+0)/(2*sigma*sigma))/(2*pi*sigma*sigma);
D = A*4 + B*4 + C;gauss_double = [A,B,A;B,C,B;A,B,A];
gauss_normal = gauss_double / sum(sum(gauss_double));
gauss_integer = floor(gauss_normal/gauss_normal(1,1));GRAY = imread('../img/gray.bmp');
[row,col] = size(GRAY);
gassin_padding  =   zeros(row+2,col+2);
gassin_result   =   zeros(row,col);for i = 1:rowfor j = 1:colgassin_padding(i+1,j+1) = GRAY(i,j);end
endfor i = 1:row+2gassin_padding(i,1) = gassin_padding(i,2);gassin_padding(i,col+2) = gassin_padding(i,col+1);
endfor i = 1:col+2gassin_padding(1,i) = gassin_padding(2,i);gassin_padding(row+2,i) = gassin_padding(row+1,i);
endfor i = 2:row+1for j = 2:col+1matrix11 = gassin_padding(i-1,j-1);matrix12 = gassin_padding(i-1,j);matrix13 = gassin_padding(i-1,j+1);matrix21 = gassin_padding(i,j-1);matrix22 = gassin_padding(i,j);matrix23 = gassin_padding(i,j+1);matrix31 = gassin_padding(i+1,j-1);matrix32 = gassin_padding(i+1,j);matrix33 = gassin_padding(i+1,j+1);matrix = [matrix11,matrix12,matrix13;matrix21,matrix22,matrix23;matrix31,matrix32,matrix33];gassin_mult = matrix.* gauss_integer;sum_gassin_matrix = sum(sum(gassin_mult()));gassin_result(i-1,j-1) = sum_gassin_matrix/16;end
enda = textread('../data/gassin_filter.txt','%s');
IMdec1 = hex2dec(a);IM1 = reshape(IMdec1,col,row);
fpga_Y = uint8(IM1)';b = textread('../data/pre.txt','%s');subplot(1,3,1)
matlab_Y = uint8(floor(gassin_result));
imshow(matlab_Y),title('MATLAB gassin算法图像');
subplot(1,3,2)
imshow(fpga_Y),title('FPGA gassin算法图像');
subplot(1,3,3)
imshow(GRAY),title('原图像');sub = matlab_Y - fpga_Y;min_sub = min(min(sub));
max_sub = max(max(sub));

在这里插入图片描述

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

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

相关文章

错误:找不到或无法加载主类(vscode的解决方法)

项目场景&#xff1a; 某天&#xff0c;喵某人在敲代码的过程中&#xff0c;点击运行代码&#xff0c;突然显示找不到或无法加载主类。之前创建的java文件都可以正常运行。但新建的java文件无论是什么&#xff0c;点击运行都会显示“错误&#xff1a;找不到或无法加载主类”。 …

【Docker系列】在 Linux 上安装 Docker Compose 的简明步骤

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于单片机多功能数字钟系统仿真设计

**单片机设计介绍&#xff0c;基于单片机多功能数字钟系统仿真设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机多功能数字钟系统仿真设计是一个结合了硬件仿真、软件编程和时钟管理技术的综合性项目。以下是对该设计项目的概…

在CentOS 7上安装Python 3.7.7

文章目录 一、实战步骤1. 安装编译工具2. 下载Python 3.7.7安装包3. 上传Python 3.7.7安装包4. 解压缩安装包5. 切换目录并编译安装6. 配置Python环境变量7. 使配置生效8. 验证安装是否成功 二、实战总结 一、实战步骤 1. 安装编译工具 在终端中执行以下命令 yum -y groupin…

小林coding图解计算机网络|基础篇02|键入网址到网页显示,期间发生了什么?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 孤单小弟——HTTP真实地址查询——DNS指南好帮手——协议栈可靠传输——TCP远程定位——IP两点传输——MAC出口——网卡送别者——交…

顺序表的应用

文章目录 目录1. 基于动态顺序表实现通讯录项目2.顺序表经典算法2.1 [移除元素](https://leetcode.cn/problems/remove-element/description/)2.2 [合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/description/) 3. 顺序表的问题及思考 目录 基于动态顺序…

VSCode好用插件

由于现在还是使用vue2&#xff0c;所以本文只记录vue2开发中好用的插件。 美化类插件不介绍了&#xff0c;那些貌似对生产力起不到什么大的帮助&#xff0c;纯粹的“唯心主义”罢了&#xff0c;但是如果你有兴趣的话可以查看上一篇博客&#xff1a;VSCode美化 1. vuter 简介&…

特朗普数字钱包被空投100万MVP,加密资产或将提供更多竞选资金

唐纳德.特朗普先生对待加密货币的态度正在发生改变&#xff0c;曾经他对加密货币持有负面的态度&#xff0c;曾多次在公开场合批评比特币等数字货币。然而&#xff0c;随着特朗普NFT等加密资产的上链&#xff0c;他对加密货币的态度也发生了巨大的转变。 据相关媒体报道&#x…

Hadoop-入门

资料来源&#xff1a;尚硅谷-Hadoop 一、Hadoop 概述 1.1 Hadoop 是什么 1&#xff09;Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2&#xff09;主要解决&#xff1a;海量数据的存储和海量数据的分析计算问题。 3&#xff09;广义上来说&#xff0c;Hadoop…

政安晨【AIGC实践】(一):在Kaggle上部署使用Stable Diffusion

目录 简述 开始 配置 执行 安装完毕&#xff0c;一键运行 结果展示 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 人工智能数字虚拟世界实践 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

GIt 删除某个特定commit

目的 多次commit&#xff0c;想删掉中间的一个/一些commit 操作方法 一句话说明&#xff1a;利用rebase命令的d表示移除commit的功能&#xff0c;来移除特定的commit # 压缩这3次commit,head~3表示从最近1次commit开始&#xff0c;前3个commit git rebase -i head~3rebase…

UNIAPP(小程序)每十个文章中间一个广告

三十秒刷新一次广告 ad-intervals"30" <template><view style"margin: 30rpx;"><view class"" v-for"(item,index) in 100"><!-- 广告 --><view style"margin-bottom: 20rpx;" v-if"(inde…

物联网行业中,我们如何选择数据库?

在当今数字化潮流中&#xff0c;我们面对的不仅是海量数据&#xff0c;更是时间的涟漪。从生产线的传感器到金融市场的交易记录&#xff0c;时间序列数据成为了理解事物演变和趋势的关键。在面对这样庞大而动态的数据流时&#xff0c;我们需要深入了解一种强大的工具——时序数…

03-自媒体文章发布

自媒体文章发布 1)自媒体前后端搭建 1.1)后台搭建 ①&#xff1a;资料中找到heima-leadnews-wemedia.zip解压 拷贝到heima-leadnews-service工程下&#xff0c;并指定子模块 执行leadnews-wemedia.sql脚本 添加对应的nacos配置 spring:datasource:driver-class-name: com…

机器学习知识点全面总结

机器学习按照模型类型分为监督学习模型、无监督学习模型两大类。 1、有监督学习 有监督学习通常是利用带有专家标注的标签的训练数据&#xff0c;学习一个从输入变量X到输入变量Y的函数映射。Y f (X)&#xff0c;训练数据通常是(nx,y)的形式&#xff0c;其中n代表训练样本的大…

初识二叉树和二叉树的基本操作

目录 一、树 1.什么是树 2. 与树相关的概念 二、二叉树 1.什么是二叉树 2.二叉树特点 3.满二叉树与完全二叉树 4.二叉树性质 相关题目&#xff1a; 5.二叉树的存储 6.二叉树的遍历和基本操作 二叉树的遍历 二叉树的基本操作 一、树 1.什么是树 子树是不相交的;…

了解这些技术:Flutter应用顺利登陆iOS平台的步骤与方法

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

HTML转pdf批量高效转换:释放文本潜力,让信息流动更自由!

在数字化信息的海洋中&#xff0c;HTML以其灵活性和互动性成为网页内容的标准格式。然而&#xff0c;有时我们需要将网页内容保存为PDF格式&#xff0c;以确保信息的稳定性和易读性。为了满足这一需求&#xff0c;我们推出了一款强大的HTML转PDF批量高效转换工具&#xff0c;让…

网络安全 | 什么是单点登录SSO?

关注WX&#xff1a;CodingTechWork SSO-概念 单点登录 (SSO) 是一种身份认证方法&#xff0c;用户一次可通过一组登录凭证登入会话&#xff0c;在该次会话期间无需再次登录&#xff0c;即可安全访问多个相关的应用和服务。SSO 通常用于管理一些环境中的身份验证&#xff0c;包…

如何在 Mac 上恢复已删除的数据

如果您丢失了 Mac 上的数据&#xff0c;请不要绝望。恢复数据比您想象的要容易&#xff0c;并且有很多方法可以尝试。 在 Mac 上遭受数据丢失是每个人都认为永远不会发生在他们身上的事情之一......直到它发生。不过&#xff0c;请不要担心&#xff0c;因为您可以通过多种方法…