6.3.1、上下翻转
函数flipud是实现一个二维矩阵的上下翻转,如
a=[1 2;3 4],经过该函数处理后,原矩阵变为[3 4;1 2];所以利用该函数也可以对图像进行上下翻转处理,但由于该函数针对二维数据的处理,所以在写程序时,要对RGB图像和灰度图像分开处理,这就要用到isrgb函数来判断,如果是灰度图像,
则可以直接用这个函数进行处理,否则就要对RGB图像进行降维处理, for k=1:3
y(:,:,k)=flipud(x(:,:,k)); end
处理结果如图:
6.3.2、左右翻转
对图像的左右翻转也可以用fliplr函数来处理,同样的,也要对灰度和彩色图像分开处理,处理结果如图:
6.3.3任意角度翻转
用函数imrotate来实现对图像的插值旋转。 该函数的调用格式如下:
B=imrotate(A,angle,method,’crop’)
其中,参数method用于指定插值的方法,可选的值可以有三种,分别为邻近插值,双线性插值,双三次插值,缺省时为邻近插值,参数angle代表旋转的角度。
一般来说,旋转后的图像会比原图大,用户可以指定“crop”参数对旋转后
9
的图像进行剪切(取图像的中间部分),使返回的图像与原图大小相同。执行结果为:
6.4、 噪声
经常用到的噪声有三种,高斯噪声,椒盐噪声,乘性噪声,可以通过以下三个函数来实现:
y=imnoise(handles.img,'gaussian',p1,p2);%高斯噪声 y=imnoise(x,'salt & pepper',p1); %椒盐噪声 y=imnoise(handles.img,'speckle',p1); %乘性噪声
p1,p2的参数也通过输入对话框的形式得到,原图加入高斯噪声后结果如下所示:
6.5、 滤波
这里选择三种滤波方法,
k=medfilt2(handles.noise_img);%中值滤波
k=wiener2(handles.noise_img,[5,5]);%自适应滤波
k=filter2(fspecial('average',3),handles.noise_img)/255;%平滑滤波
同样的,这些函数也是针对二维数据,所以要先判断是彩色图像还是灰度图像,然后分别进行处理,下面是对彩色图像的自适应滤波处理: i=handles.noise_img;
10
if isrgb(i)
a=handles.noise_img(:,:,1); b=handles.noise_img(:,:,2); c=handles.noise_img(:,:,3);
k(:,:,1)=wiener2(a,[5,5]); k(:,:,2)=wiener2(b,[5,5]); k(:,:,3)=wiener2(c,[5,5]); imshow(k); 执行结果如图:
对其他方法的滤波程序也类似,由于把各个滤波方法放在一个选择框里,所以程序要用以下的选择语句:
switch str
case '中值滤波' case '自适应滤波' case '平滑滤波'
end
6.6、 直方图统计
用imhist函数对图像数据进行直方图统计,
x=imhist(handles.img(:,:,1)); bar(horz,x);
其中,x矩阵的数据是0~255灰度值的统计个数,如果直接对x矩阵数据进行图形图显示,由于有256个数据,在坐标系中就会很密集,为了更清楚的显示条形图,所以在程序设计时,把x数据进行部分提取,
x1=x(1:10:256); horz=1:10:256; bar(horz,x1);
除了显示数据的直方图统计外,还可以对图像进行均衡处理,所用到的函数是histeq,这两个函数同样只使用于二维数据,所以也要对二维和三维数据分开处理。
直方图显示和均衡后的图像分别如下图所示
11
6.7、 频谱分析 6.7.1、频谱图
为了得到图像的频谱图,先要对数据进行傅里叶变换,用fft2函数对二维数据进行快速傅里叶变换,同时为了更好的观察频谱图,需要把fft2变换后的数据进行平移,利用fftshift函数,把快速傅里叶变换的DC 组件移到光谱中心。这样图像能量的低频成分将集中到频谱中心,图像上的边缘、线条细节信息等高频成分将分散在图像频谱的边缘。如下图所示:
6.7.2、通过高通滤波器
axes(handles.axes2); x=(handles.img); if isrgb(x)
msgbox('这是彩色图像,不能通过高通滤波器','失败'); else
y1=imnoise(x,'gaussian'); %加高斯噪声 f=double(y1); % 数据类型转换 k=fft2(f); % 傅立叶变换 g=fftshift(k); % 转换数据矩阵 [M,N]=size(g); nn=2;
d0=3; %截止频率为3 m=fix(M/2); n=fix(N/2); for i=1:M
12