当前位置:文档之家› 高斯滤波

高斯滤波

方法一:clc;a=imread('yuan.bmp'); %读取图像矩阵figure(1);imshow(a);%显示原始图像b=double(a);%对图像矩阵进行处理%disp(b);[m,n]=size(b);tem=[1 1 2 1 1;1 2 4 2 1;2 4 8 4 2;1 2 4 2 1;1 1 2 1 1];%高斯5*5的模板。

for i=3:m-2 %不处理边缘的像素点。

for j=3:n-2t=0;for x=1:5for y=1:5t=t+tem(x,y)*b(i-3+x,j-3+y);%对每一个点进行线性叠加。

endendt=t/52;%乘以系数。

也就是平滑度if t>255 %不能大于255,也不能小于0t=255;elseif t<0t=0;endb(i,j)=t;endendfigure(2);disp(b);b=uint8(b);%复原,没有这一项处理,最后显示的就是一张空白。

imshow(b);%显示处理后的图像。

以上程序是仿照c++程序写的,搞了几天,才有结果的,在显示图像的时候老是出现问题,不是黑图,就是白图,原来是范围的问题,读出;来的矩阵范围太小,转化为更大的,转化后再转化回来。

下面是关于数据范围的说明,希望有帮助。

imshow和image: 图像的显示是最为重要的,用imshow和image都可以显示图像,但是有一定的区别。

用的不对,就会象我最初一样,老是出错,或者得到一张空白图或者是彩色图显示成颗粒状、反相黑白图等等。

image是用来显示附标图像,即显示的图像上有x,y坐标轴的显示,可以看到图像的像素大小。

imshow 只是显示图像。

它们都可以用subplot来定位图像显示的位置,用colormap来定义图像显示用的颜色查找表,比如用colormap(pink),可以把黑白图像显示成带粉红色的图像,很有趣的。

在这里最值得注意的是要显示的图像像素矩阵的数据类型。

显示真彩色图像像素三维矩阵X,如果是uint8类型,要求矩阵的数据范围为0-255,如果是double型,则其数据范围为0-1,要不就会出错或者出现空白页。

类型转换很简单,如果你原来的数值是uint8,在运算中转换为double 后,实际要显示的数值没有改变的话,只要用uint8(X)就可转换为uint8型,如果不想转换频繁,也可在显示时用X/255来转换为符合0-1double类型范围要求的数值显示。

如果显示索引图像(二维矩阵),因为不同数据类型对应颜色查找表colormap的基点不同,会有所区别,如果不对的话,会出现很多意外的显示效果的。

如果索引图像像素数值是double型,则它的取值范围为1-length(colormap),数值起点为1,则矩阵中数值为1的对应colormap中第一行数据,如果索引图像像素数值是uint8,则取值范围为0-255,数值起点为0,则矩阵中数值为0的对应colormap中第一行数据,所以索引图像这两个数据类型之间的转换,要考虑到+1或-1。

直接用uint8或double转换则会查找移位,产生失真情况。

uint16数据类型与uint8类似,取值范围为0-65536。

方法二;%图像高斯平滑滤波处理img=imread('1.jpg');f=rgb2gray(img);subplot(1,2,1);imshow(f);f=double(f);f=fft2(f);f=fftshift(f);[m,n]=size(f); %d0=80;m1=fix(m/2);n1=fix(n/2);for i=1:mfor j=1:nd=sqrt((i-m1)^2+(j-n1)^2);h(i,j)=exp(-d^2/2/d0^2);endendg=f.*h;g=ifftshift(g);g=ifft2(g);g=mat2gray(real(g));subplot(1,2,2);imshow(g);imwrite(img,'2.jpg');处理前后比照:方法三:高斯低通滤波对图像进行低通滤波代码,这个是灰度图像的彩色图像就是取出RGB三个分量进行滤波再整合I1=imread('flower.jpg'); %读取图像I=rgb2gray(I1); %将图像变为灰度图象%将灰度图像的二维不连续Frourier变换的零频率成分移到频谱的中心s=fftshift(fft2(I));[M,N]=size(s); %分别返回s的行数到M中,列数到N中n=2; %对n赋初值%GLPF滤波,d0=5,15,30(程序中以d0=30为例)d0=30; %初始化d0n1=floor(M/2); %对M/2进行取整n2=floor(N/2); %对N/2进行取整for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2); %点(i,j)到傅立叶变换中心的距离h=1*exp(-1/2*(d^2/d0^2)); %GLPF滤波函数s(i,j)=h*s(i,j); %GLPF滤波后的频域表示endends=ifftshift(s); %对s进行反FFT移动%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数s=uint8(real(ifft2(s)));figure; %创建图形图像对象imshow(s); %显示GLPF滤波处理后的图像title('GLPF滤波(d0=30)'); %为经GLPF滤波后的图像添加标题方法四:clear;clc;I=imread('红萝卜[灰白].JPG');[a,b]=size(I);figuresubplot(1,2,1);imshow(I);title('灰白原图');K=imnoise(I,'salt & pepper',0.02);[a,b]=size(K);subplot(1,2,2);imshow(K);title('加椒盐噪声后图像');%3*3中值滤波for i=1:afor j=1:bif(i==1|i==a|j==1|j==b)G(i,j)=K(i,j);elsetemp(1)=K(i-1,j-1);temp(2)=K(i-1,j);temp(3)=K(i-1,j+1);temp(4)=K(i,j-1);temp(5)=K(i,j);temp(6)=K(i,j+1);temp(7)=K(i+1,j-1);temp(8)=K(i+1,j);temp(9)=K(i+1,j+1);temp=sort(temp);G(i,j)=temp(5);endendendfiguresubplot(1,2,1);imshow(G);title('3×3中值滤波后的图像'); %5*5中值滤波for i=1:afor j=1:bif(i==1|i==2|i==a-1|i==a|j==1|j==2|j==b-1|j==b)G5(i,j)=K(i,j);elsetemp(1)=K(i-2,j-2);temp(2)=K(i-2,j-1);temp(3)=K(i-2,j);temp(4)=K(i-2,j+1);temp(5)=K(i-2,j+2);temp(6)=K(i-1,j-2);temp(7)=K(i-1,j-1);temp(8)=K(i-1,j);temp(9)=K(i-1,j+1);temp(10)=K(i-1,j+2);temp(11)=K(i,j-2);temp(12)=K(i,j-1);temp(13)=K(i,j);temp(14)=K(i,j+1);temp(15)=K(i,j+2);temp(16)=K(i+1,j-2);temp(17)=K(i+1,j-1);temp(18)=K(i+1,j);temp(19)=K(i+1,j+1);temp(20)=K(i+1,j+2);temp(21)=K(i+2,j-2);temp(22)=K(i+2,j-1);temp(23)=K(i+2,j);temp(24)=K(i+2,j+1);temp(25)=K(i+2,j+2);temp=sort(temp);G5(i,j)=temp(13);endendendsubplot(1,2,2);imshow(G5);title('5×5中值滤波后的图像');方法五:MATLAB给图片加椒盐噪声和滤噪M=imread('dl011.jpg') %读取MATLAB中的名为cameraman的图像subplot(3,3,1)imshow(M) %显示原始图像title('original')P1=imnoise(M,'gaussian',0.02) %加入高斯躁声subplot(3,3,2)imshow(P1) %加入高斯躁声后显示图像title('gaussian noise');P2=imnoise(M,'salt & pepper',0.02) %加入椒盐躁声subplot(3,3,3)imshow(P2) %%加入椒盐躁声后显示图像title('salt & pepper noise');g=medfilt2(P1) %对高斯躁声中值滤波subplot(3,3,5)imshow(g)title('medfilter gaussian')h=medfilt2(P2) %对椒盐躁声中值滤波subplot(3,3,6)imshow(h)title('medfilter salt & pepper noise')l=[1 1 1 %对高斯躁声算术均值滤波1 1 11 1 1];l=l/9;k=conv2(P1,l)subplot(3,3,8)imshow(k,[])title('arithmeticfilter gaussian')%对椒盐躁声算术均值滤波d=conv2(P2,l)subplot(3,3,9)imshow(d,[])title('arithmeticfilter salt & pepper noise')。

相关主题