MATLAB-高斯滤波的实现

简介: MATLAB-高斯滤波的实现

1、内容概要


高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

一位高斯分布


image.png

二位高斯分布:


image.png

高斯滤波后图像被平滑的程度取决于标准差。它的输出是临域像素的加权平均,同时离中心越近的像素权重越高。因此,相对于均值滤波(mean filter)它的平滑效果更柔和,而且边缘保留的也更好。高斯滤波被用作为平滑滤波器的本质原因是因为它是一个低通滤波器,而且大部份基于卷积平滑滤波器都是低通滤波器。GAUSS 滤波算法克服了边界效应,因而滤波后的图像较好。

2.  高斯滤波算法实现步骤


image.png

image.png

1>串行像素形成 3x3 矩阵

(x-1,y-1)  (x,y-1)  (x+1,y-1)

(x-1,y)       (x,y)     (x+1,y)

(x-1,y+1) (x,y+1)  (x+1,y+1)

f(x,y)表示(x,y)点的像素值;

g(x,y)表示(x,y)点经过高斯滤波处理后的值;

2>用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值

g(x,y)=(1/16)* (f(x-1,y-1)+2f(x,y-1)+f(x+1,y-1)

                            +2f(x-1,y)+4f(x,y) + 2f(x+1,y)+

                             f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1))------------------------------(1)

3> 用模板扫描图像中的每一个像素

image.png

如图 1 所示,使用高斯滤波模板从屏幕的左上角(从左到右),没扫完一行

换下一行(从上到下)扫完整个屏幕,最终完成一帧图的高斯滤波。

本文来自知识星球(FPGA自习学院)

matlab代码的实现:

M=imread('go.jpg'); %读取图像[ROW,COL, DIM] =size(M);%保存图像尺寸subplot(3,3,1),imshow(M),title('original');%显示原始图像P1=imnoise(M,'gaussian',0.05); %加入高斯躁声subplot(3,3,2),imshow(P1),title('gaussian noise');%加入高斯躁声后显示图像P1=im2double(P1);
guss_filter_img=P1;
forr=2:1:ROW-1forc=2:1:COL-1ford=1:3guss_filter_img(r,c,d) =(P1(r-1, c-1,d) +P1(r-1, c,d)*2+P1(r-1, c+1,d) +...
P1(r, c-1,d)*2+P1(r, c,d)*4+P1(r, c+1,d)*2+...
P1(r+1, c-1,d) +P1(r+1, c,d)*2+P1(r+1, c+1,d))/16;
endendendsubplot(3,3,3),imshow(guss_filter_img),title('guss_img');

简单的利用了3X3的算子实现了对高斯噪声的过滤功能

在这里简要说明下为什么要进行操作

1. P1=im2double(P1);
2. guss_filter_img=P1;

因为开始的图片是uint8类型的,进行运算后会出现小数,这是的运算结果将是错误的,(我试了好多次,在工作区看到了类型的区别,不进行转换将会显示

下图是只使用

guss_filter_img=P1;

image.png

使用这两行代码:

1. guss_filter_img=P1;
2. guss_filter_img=im2double(guss_filter_img);

此时对应的工作区数值

double类型的

image.png

为了节省存储空间,matlab为图像提供了特殊的数据类型uint8(8位的无符号整数),以此方式存储的图像称作8位图像。

imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位的RGB中。

因此,matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,

I2=imdouble(I1); %把图像I1转换成double精度类型 (假设图形矩阵范围0~255)

或者I64=double(I8)/255; %uint转换成double如果不转换,计算会产生溢出。

虽然matlab中读入图像的数据类型是uint8,而在图像矩阵运算的时候,使用的数据类型却是double类型。一是为了保证精度,二是因为如果不转换,在对uint8进行加减时会产生溢出,可能提示的错误为:  

Function*isnotdefinedforvaluesofclass‘uint8’

1个字节无符号整型最大只能存储数据为255,对图片的操作所以很容易溢出。

这里其实也体现了图像归一化的操作。

效果截图

image.png

目录
相关文章
|
机器学习/深度学习 传感器 算法
分类预测 | MATLAB实现BiLSTM双向长短期记忆神经网络多特征分类预测
分类预测 | MATLAB实现BiLSTM双向长短期记忆神经网络多特征分类预测
|
算法 数据安全/隐私保护 异构计算
m基于Lorenz混沌自同步的混沌数字保密通信系统的FPGA实现,verilog编程实现+MATLAB混沌验证程序
m基于Lorenz混沌自同步的混沌数字保密通信系统的FPGA实现,verilog编程实现+MATLAB混沌验证程序
231 0
m基于Lorenz混沌自同步的混沌数字保密通信系统的FPGA实现,verilog编程实现+MATLAB混沌验证程序
|
机器学习/深度学习 传感器 算法
【图像分类】基于卷积神经网络实现花朵图像分类附matlab代码
【图像分类】基于卷积神经网络实现花朵图像分类附matlab代码
|
机器学习/深度学习 传感器 算法
分类预测 | MATLAB实现ELM极限学习机多特征分类预测(四分类)
分类预测 | MATLAB实现ELM极限学习机多特征分类预测(四分类)
|
机器学习/深度学习 传感器 人工智能
基于Matlab实现ASK、PSK、FSK 调制和 BER 与 SNR 计算附完整代码
基于Matlab实现ASK、PSK、FSK 调制和 BER 与 SNR 计算附完整代码
|
机器学习/深度学习 传感器 人工智能
【ELM回归预测】基于极限学习机实现气象影响因子光伏出力预测附matlab代码
【ELM回归预测】基于极限学习机实现气象影响因子光伏出力预测附matlab代码
|
机器学习/深度学习 数据采集 传感器
分类预测 | MATLAB实现LSTM长短期记忆神经网络多特征分类预测
分类预测 | MATLAB实现LSTM长短期记忆神经网络多特征分类预测
|
机器学习/深度学习 传感器 算法
【LSTM时序预测】基于卷积神经网络结合长短时记忆CNN-LSTM实现时序数据预测附matlab代码
【LSTM时序预测】基于卷积神经网络结合长短时记忆CNN-LSTM实现时序数据预测附matlab代码
|
机器学习/深度学习 传感器 算法
【Kelm回归预测】基于粒子群算法优化核极限学习机实现数据回归预测附matlab代码
【Kelm回归预测】基于粒子群算法优化核极限学习机实现数据回归预测附matlab代码
|
机器学习/深度学习 传感器 运维
【信号检测】基于LSTM实现工业机器信号数据异常检测附matlab代码
【信号检测】基于LSTM实现工业机器信号数据异常检测附matlab代码