目录
1.图像的统计特性
(1)概论
(2)图像均值
(3)图像的标准差
(4)图像的相关系数
(5)图像的等高线
2.空域滤波
(1)线性平均滤波(领域相卷积计算)
(2)线性平均滤波(二维卷积计算)
(3)二维线性数字滤波
(4)非线性空域滤波
(5)中值滤波
(6)排序滤波
(7)自适应滤波
(8)拉普拉斯算子锐化滤波器
在MATLAB中,灰度图像是一个二维矩阵,RGB彩色图像是三维矩阵。图像作为矩阵,可以计算其平均值、方差和相关系数等统计特征。
采用函数mean2()计算矩阵的均值,对于RGB图像来说,调用方法如下:
J=mean2(I):获得图像I所有颜色值的平均值
J=mean2(I (: , : , N) ):获得每种颜色值的平均值。N参数若为1表示红色,为2表示绿色,为3表示蓝色。
代码(计算灰度图像和彩色图像的平均值):
close all;clear all;clc;
I=imread('D:/resource_photo/8.jpg');
J=rgb2gray(I);
gray=mean2(J);
rgb=mean2(I);
r=mean2(I(:,:,1));
g=mean2(I(:,:,2));
b=mean2(I(:,:,3));
figure;
subplot(121);imshow(uint8(I));
subplot(122);imshow(uint8(J));
运行结果:
在matlab中,采用函数std()来计算向量的标准差,通过std2()来计算矩阵的标准差。
eg.灰度图像的像素为二维矩阵A,则该图像的标准差是std2(A).
代码(计算灰度图像的标准差):
close all;clear all;clc;
I=imread('D:/resource_photo/8.jpg');
J=rgb2gray(I);
s1=std2(J); %计算标准差
K=histeq(J); %直方图均衡化
s2=std2(K);
figure;
subplot(121);imshow(uint8(J));
subplot(122);imshow(uint8(K));
运行结果:
采用函数corr2()计算两个灰度图像的相关系数,调用方式如下:
r=corr2(A,B):其中A和B为大小相等的二维矩阵,r为两个矩阵的相关系数。
代码(计算两个灰度图像的相关系数):
close all;clear all;clc;
I=imread('D:/resource_photo/8.jpg');
J=rgb2gray(I);
K=medfilt2(J); %中值滤波
r=corr2(J,K); %计算相关系数
figure;
subplot(121);imshow(uint8(J));
subplot(122);imshow(uint8(K));
运行结果:
在matlab中通过函数imcontour()可以绘制灰度图像的等高线,调用方法如下:
imcontour(I):该函数中I为灰度图像的二维数据矩阵,绘制灰度图像的等高线。
imcontour(I,n):该函数设置等高线的条数为n,如果不指定n,该函数会自动选取n。
代码(计算灰度图像的等高线):
close all;clear all;clc;
I=imread('D:/resource_photo/8.jpg');
J=rgb2gray(I);
figure;
subplot(121);imshow(J);
subplot(122);imcontour(J,3);
运行结果:
线性平均滤波是一种最常用的线性空域滤波。线性平均滤波实际是一种低通滤波,信号的低频部分通过,阻止高频部分通过。由于图像的边缘处于高频部分,因此线性平均滤波后,会造成图像边缘的模糊。
在进行图像的滤波时,可以采用模板和图像的领域相卷积的方法。使用函数imfilter()。
代码(通过函数imfilter对图像进行平滑):
close all;clear all;clc;
I=imread('D:/resource_photo/8.jpg');
J=imnoise(I,'salt & pepper',0.02); %加入椒盐噪声
h=ones(3,3)/5;
h(1,1)=0; h(1,3)=0;
h(3,1)=0; h(1,3)=0;
K=imfilter(J,h); %图像的滤波
figure,imshow(I);
figure,imshow(J);
figure,imshow(K);
运行结果:
(如上两图,左为原图,右为加入椒盐噪声后的图像)
(上图为对加入噪声图像使用线性平均滤波后的图像)
在matlab中,使用conv2()进行二维卷积计算,调用方式如下:
J = conv2(A,B) :返回矩阵 A 和 B 的二维卷积。
J = conv2(u,v,A): 首先求 A 的各列与向量 u 的卷积,然后求每行结果与向量 v 的卷积。
J = conv2(A,B,shape) :根据 shape 返回卷积的子区。例如,C = conv2(A,B,'same') 返回卷积中大小与 A 相同的中心部分。
代码(使用二维卷积函数对图像进行平滑):
close all;clear all;clc;
I=imread('D:/resource_photo/7.jpg');
I=rgb2gray(I);
I=im2double(I);
J=imnoise(I,'gaussian',0,0.01); %加入高斯噪声
h=ones(3,3)/9;%产生模板
K=conv2(J,h,'same'); %对图像进行二维卷积计算(滤波)
figure,imshow(I);
figure,imshow(J);
figure,imshow(K);
运行结果:
可以使用filter2()进行二维线性数字滤波,采用函数fspecial()产生滤波器模板。
代码(使用conv2()对图像进行平滑):
close all;clear all;clc;
I=imread('D:/resource_photo/7.jpg');
I=rgb2gray(I);
I=im2double(I);
J=imnoise(I,'gaussian',0,0.01); %加入高斯噪声
h=fspecial('average',3);%生成3*3模板
K=filter2(h,J); %对图像进行二维卷积计算(滤波)
figure,imshow(I);
figure,imshow(J);
figure,imshow(K);
运行结果:
非线性空域滤波主要包括中值滤波、顺序统计滤波和自适应滤波等。
中值滤波是一种保护边缘的非线性图像平滑方法。
二维中值滤波用于图像的增强。中值滤波可以去除图像中的椒盐噪声,平滑效果优于均值滤波,在抑制噪声的同时还能够保持图像的边缘清晰。
在matlab中,采用函数medfilt2()进行图像的二维中值滤波。
代码(对图像进行中值滤波):
close all;clear all;clc;
I=imread('D:/resource_photo/7.jpg');
I=rgb2gray(I);
I=im2double(I);
J=imnoise(I,'salt & pepper',0.03); %加入椒盐噪声
K=medfilt2(J); %对图像进行二维中值滤波
figure;
subplot(131);imshow(I);%原始图像
subplot(132);imshow(J);%加入噪声图像
subplot(133);imshow(K);%滤波处理后图像
运行结果:
在matlab中采用ordfilt2()方法进行排序滤波。
(函数medfilt2()进行滤波时,选取的是排序后的中值,所以当调用方法为J=ordfilt2(I,median(1:m*n),[m,n])时,相当于中值滤波)
代码(对图像进行排序滤波):
close all;clear all;clc;
I=imread('D:/resource_photo/7.jpg');
I=rgb2gray(I);
I=im2double(I);
J=imnoise(I,'salt & pepper',0.03); %加入椒盐噪声
K1=ordfilt2(J,1,true(5)); %对图像进行排序滤波(选取排序后第一个作为输出结果)
K2=ordfilt2(J,25,true(5));%选取排序后第25个作为输出结果
figure;
subplot(131);imshow(J);%原始图像
subplot(132);imshow(K2);
subplot(133);imshow(K1);%滤波处理后图像
运行结果:
在matlab中使用wiener2()根据图像的噪声进行自适应滤波;根据图像的局部方差来调整滤波器的输出。
代码(对图像进行自适应滤波):
close all;clear all;clc;
I=imread('D:/resource_photo/7.jpg');
I=rgb2gray(I);
I=im2double(I);
J=imnoise(I,'gaussian',0,0.1); %加入椒盐噪声
K=wiener2(J,[5 5]);%对图像进行自适应滤波
figure;
subplot(131);imshow(I);%原始图像
subplot(132);imshow(J);%加入噪声图像
subplot(133);imshow(K);%滤波处理后图像
运行结果:
对于模糊的图像,通过锐化滤波器能够补偿图像的轮廓,让图像变得清晰。
锐化滤波器尝试用拉普拉斯算子。拉普拉斯算子比较适合用于改善因为光线的漫反射造成的图像模糊。
代码(对图像进行锐化滤波):
close all;clear all;clc;
I=imread('D:/resource_photo/7.jpg');
I=rgb2gray(I);
I=im2double(I);
h=[0,1,0;1,-4,1;0,1,0];%拉普拉斯算子
J=conv2(I,h,'same');%二维卷积
K=I-J;
figure;
subplot(121);imshow(I);%原始图像
subplot(122);imshow(K);%滤波处理后图像
运行结果: