0
点赞
收藏
分享

微信扫一扫

MATLAB-高斯滤波的实现


 1、内容概要

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

一位高斯分布:

MATLAB-高斯滤波的实现_数据类型

二位高斯分布:

MATLAB-高斯滤波的实现_高斯滤波_02


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

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

MATLAB-高斯滤波的实现_数据类型_03

MATLAB-高斯滤波的实现_数据类型_04



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> 用模板扫描图像中的每一个像素

MATLAB-高斯滤波的实现_数据类型_05

如图 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;
for r = 2:1:ROW-1
for c = 2:1:COL-1
for d =1:3
guss_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;
end
end
end
subplot(3,3,3),imshow(guss_filter_img),title('guss_img');

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

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

P1=im2double(P1);
guss_filter_img=P1;

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

下图是只使用

guss_filter_img=P1;

MATLAB-高斯滤波的实现_2d_06

使用这两行代码:

guss_filter_img=P1;
guss_filter_img=im2double(guss_filter_img);

MATLAB-高斯滤波的实现_2d_07

此时对应的工作区数值

double类型的

MATLAB-高斯滤波的实现_2d_08

为了节省存储空间,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 ‘*’ is not defined for values of class ‘uint8’


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

效果截图

MATLAB-高斯滤波的实现_高斯滤波_09

举报

相关推荐

0 条评论