Matlab图像处理-读书笔记
3. 图像文件的读取
%图像文件读取 I=imread('filename','fmt'); %图像文件的写入 imwrite(I,'filename','fmt'); %图像显示 imtool(I); imshow(I); %视频文件的读取 aviread('filename'); info=mmreader('filename'); %视频文件播放 movie(M); %转换为二值图像 I1=im2bw(I);
4. 数字图像的运算
1 %matlab进行图像代数运算之前首先要将数据类型转换为double 2 I=im2double(I)
4.1 图像的像素运算
1 %灰度线性变换函数 2 gamma=0.5; %设定调整线性度取值 3 A1=imadjust(A,[0.5 0.8],[0 1],gamma); 4 5 %图像的加法运算 6 %实现两个图像的叠加;加一个常数,可以提高图像整体亮度;同一幅图像叠加求平均可以消除原图像的附加噪声(噪声互不相关,且均值为0) 7 Z=imadd(X,Y); 8 9 %图像中加入噪声 10 J=imnoise(I,type,parameters); 11 12 %图像减法 Z=X-Y 13 %常用于检测图像变化及运动物体的图像处理方法 14 Z=imsubtract(X,Y); 15 16 %图像乘法运算 17 %功能:一可以实现掩膜操作,屏蔽图像的某些部分;二是乘以一个大于1的常数因子能增强图像的亮度,乘以一个小于1的常数因子会使图像变暗 18 Z=immultiply(X,Y); 19 20 %图像的除法运算 21 %图像的除法运算给出的是两幅图像的相应像素值的变化比率,又称比率变换,常用于校正成像设备的非线性影响 22 Z=imdivide(X,Y); 23 24 %绝对值差函数 25 D=imabsdiff(C,B); 26 27 %图像求补函数 28 IM2=imcomplement(IM); 29 30 %图像运算的线性组合函数 31 Z=imlincomb(K1,A1,K2,A2,...,Kn,An);
4.2 图像的几何变换
1 %图像的平移/镜像/转置 2 %没有具体的图像平移/镜像/转置函数,可以用MATLAB指令编程实现move 3
function J=move(I,a,b) % 定义一个函数名字move,I表示输入图像,a和b描述I图像沿着x轴和y轴移动的距离 % 不考虑平移以后,图像溢出情况,找不到对应点的地方都赋值为1 [M,N,G]=size(I);%获取输入图像I的大小 I=im2double(I); %将图像数据类型转换成双精度 J=ones(M,N,G); %初始化新图像矩阵全为1,大小与输入图像相同 for i=1:M for j=1:N if((i+a)>=1&&(i+a<=M)&&(j+b>=1)&&(j+b<=N));%判断平移以后行列坐标是否超出范围 J(i+a,j+b,:)=I(i,j,:);%进行图像平移 end end end function OutImage=mirror(InImage,n) %mirror函数实现图像镜像变换功能 %参数n为1时,实现水平镜像变换 %参数n为2时,实现垂直镜像变换 %参数n为3时,实现水平垂直镜像变换 I=InImage; [M,N,G]=size(I);%获取输入图像I的大小 J=I; %初始化新图像矩阵全为1,大小与输入图像相 if (n==1) for i=1:M for j=1:N J(i,j,:)=I(M-i+1,j,:);%n=1,水平镜像 end end; elseif (n==2) for i=1:M for j=1:N J(i,j,:)=I(i,N-j+1,:);%n=2,垂直镜像 end end elseif (n==3) for i=1:M for j=1:N J(i,j,:)=I(M-i+1,N-j+1,:);%n=3,水平垂直镜像 end end else error('参数n输入不正确,n取值1、2、3')%n输入错误时提示 end OutImage=J; function J=transp(I) %I表示输入的原始图像 %J表示经过转置以后的图像 [M,N,G]=size(I);%获取输入图像I的大小 I=im2double(I); %将图像数据类型转换成双精度 J=ones(N,M,G); %初始化新图像矩阵全为1,大小与输入图像相同 for i=1:M for j=1:N J(j,i,:)=I(i,j,:);%进行图像转置 end end function J=move1(I,a,b) % 定义一个函数名字move,I表示输入图像,a和b描述I图像沿着x轴和y轴移动的距离 % 考虑平移以后,图像溢出情况,采用扩大显示区域的方法 [M,N,G]=size(I);%获取输入图像I的大小 I=im2double(I); %将图像数据类型转换成双精度 J=ones(M+abs(a),N+abs(b),G); %初始化新图像矩阵全为1,大小根据考虑x轴和y轴的平移范围 for i=1:M for j=1:N if(a<0 && b<0);%如果进行右下移动,对新图像矩阵进行赋值 J(i,j,:)=I(i,j,:); else if(a>0 && b>0); J(i+a,j+b,:)=I(i,j,:);%如果进行右上移动,对新图像矩阵进行赋值 else if(a>0 && b<0); J(i+a,j,:)=I(i,j,:);%如果进行左上移动,对新图像矩阵进行赋值 else J(i,j+b,:)=I(i,j,:);%如果进行右下移动,对新图像矩阵进行赋值 end end end end end
4 %图像的缩放
5 B=imresize(A,m) %默认最近邻插值
6 B=imresize(A,[mrows ncols]) %按行和列进行缩放
7 B=imresize(A,m,method) %nearest最近邻插值法、bilinear双线性插值、bicubic双三次差值
8
9 %图像的旋转, 以图像中心为原点,将所有像素旋转相同角度
10 B=imrotate(A,angle)
11 B=imrotate(A,angle,method) %同缩放的method
12 B=imrotate(A,angle,method,bbox) %
13
14 %图像的剪切
15 I2=imcrop(I,rect) %rect说明剪切矩形区域大小
16 [I2,rect]=imcrop(...) %利用鼠标选择剪切区域,并将剪切区域返回给I2,区域大小返回给rect
17
18 %图像的空间变换
19 B=imtransform(A,TFORM) %TFORM:空间变换参数的结构体
20
21 %空间变换参数
22 T=maketform('affine',A)
23 %结合函数maketform()和函数imtransform()可以实现图像的旋转、缩放、平移和切换
4.3 图像的邻域和块操作
1 %-------图像的邻域操作------- 2 3 %通用滑动邻域操作函数 4 B=nlfilter(A,[m,n],fun) 5 6 %列方向邻域操作函数 7 B=colfilt(A,[m,n],block_type,fun) 8 9 %分离邻域操作函数 10 B=blockproc(A,[M N],fun) 11 12 %--------图像的区域选取--------- 13 14 %多边形区域选择函数 15 BW=roiploy(I) 16 17 %灰度ROI区域选择函数 18 BW=roicolor(A,low,high) 19 20 %区域填充函数 21 J=roifill(I) 22 23 %区域滤波函数 24 J=roifilt2(h,I,BW)
5.
1 %%--------灰度变换增强------- 2 3 %图像的灰度调整 4 J=imadjust(I,[low_in high_in],[low_out high_out]); 5 J=imadjust(I,[low_in high_in],[low_out high_out],gamma); %gamma等于1时为线性映射,否则为非线性映射;gamma<1:加强亮色值的输出;gamma>1:加强暗色值的输出 6 %对彩色图像增强,是对彩色图像的RGB值分别进行操作 7 J=imadjust(I,[0.2 0.3 0; 0.6 0.7 1],[]); 8 9 %计算灰度图像的最佳输入区间 10 M=stretchlim(I); %函数imadjust的第二个参数 11 J=imadjust(I,M,[]); 12 13 %改变灰度图像的亮度 14 imshow(I) 15 brighten(beta); %通常放在imshow()后面;beta大于0小于1时,图像变亮;小于0大于-1,图像变暗 16 17 %图像反转变换 18 J=imcomplement(I); %增强暗色背景下的白色或灰色细节 19 20 %%--------直方图增强-------- 21 22 %获取灰度图像的直方图 23 imhist(I); 24 imhist(I,n); %n:灰度级数目,默认值256 25 26 %RGB彩色图像的颜色直方图 27 I=imread('onion.png'); 28 imhist(I(:,:,1)); %R 29 imhist(I(:,:,2)); %G 30 imhist(I(:,:,3)); %B 31 32 %彩色图像的HSV分量直方图 33 I=imread('football.jpg'); 34 J=rgb2hsv(I); 35 imhist(J(:,:,1)); %H 36 imhist(J(:,:,2)); %S 37 imhist(J(:,:,3)); %V 38 39 %直方图均衡化 40 J=histeq(I,n); %n:灰度级数目,默认值64 41 42 %直方图规定化处理 43 hgram=oens(1,256); 44 J=histeq(I,hgram); %hgram:整数向量,表示用户希望的直方图形状
5.2 图像的统计特性
1 %图像均值 2 I=imread('onion.png'); 3 J=rgb2gray(I); 4 gray=mean2(J); %灰度图像的平均灰度值,计算二维矩阵的均值 5 rgb=mean2(I); %RGB图像所有颜色的平均值 6 r=mean2(I(:, :, 1)); %RGB彩色图像每种颜色的平均值 7 g=mean2(I(:, :, 2)); 8 b=mean2(I(:, :, 3)); 9 10 %图像的标准差 11 s=std2(I) 12 13 %图像的相关系数 14 r=corr2(A,B); %两个灰度图像的相关系数,A和B为大小相等的二维矩阵 15 16 %图像的等高线 17 imcontour(I); 18 imcontour(I,n); %n:等高线条数
5.3 空域滤波
1 %------线性空域滤波------- 2 3 %邻域相卷积 imfilter 4 I=imread('coins.png'); 5 J=imnoise(I, 'salt & pepper', 0.02); %添加噪声 6 h=ones(3,3)/5; %建立模板 7 h(1,1)=0; h(1,3)=0; 8 h(3,1)=0; h(1,3)=0; 9 K=imfilter(J, h); %图像滤波 10 11 %二维卷积 conv2 12 I=im2double(I); 13 J=imnoise(I, 'gaussian', 0, 0.01); 14 h=ones(3,3)/9; 15 K=conv2(J, h); 16 17 %二维线性数字滤波 filter2 18 I=imread('coins.png'); 19 I=im2double(I); 20 J=imnoise(I, 'salt & pepper', 0.02); 21 h=fspecial('average', 3); %产生滤波器模板 22 K=filter2(h, J); 23 imshow(K); 24 25 %------非线性空域滤波------- 26 27 %中值滤波 28 %保护边缘的非线性图像平滑方法;非常适合去除图像的椒盐噪声 29 K=medfilt2(J); 30 31 %排序滤波 32 I=imread('coins.png'); 33 I=im2double(I); 34 %最小值滤波 35 J1=ordfilt2(I, 1, true(5)); %模板大小5*5=25,取排序后的最小值 36 %最大值滤波 37 J2=ordfilt2(I, 25, true(5)); %取排序后的最大值 38 39 %自适应滤波 40 %根据图像的局部方差来调整滤波器的输出。局部方差大时,滤波器平滑效果较弱;局部方差小时,滤波器平滑效果较强 41 I=im2double(I); 42 J=imnoise(I, 'gaussian', 0, 0.01); 43 K=wiener2(J, [5 5]); 44 45 %锐化滤波器-拉普拉斯算子 46 %补偿模糊图像的轮廓,让图像变得清晰 47 %拉普拉斯算子比较适合用于改善因为光线的漫散射造成的图像模糊 48 I=imread('rice.png'); 49 I=im2double(I); 50 h=[0,1,0; 1, -4, 1; 0, 1, 0]; %拉普拉斯算子 51 J=conv2(I, h, 'same'); %通过卷积对图像进行锐化滤波 52 K=I-J; 53 imshow(K)
5.4 频域滤波
1 %---------低通滤波--------- 2 3 %效果是图像去噪声平滑增强,但同时也抑制了图像的边界,造成图像不同程度的模糊 4 5 % 1.理想低通滤波器 6 %有很严重的振铃现象 7 I=imread('coins.png'); 8 I=im2double(I); %原图像 9 M=2*size(I,1); %滤波器的行数 10 N=2*size(I,2); %滤波器的列数 11 u=-M/2:(M/2-1); 12 v=-N/2:(N/2-1); 13 [U,V]=meshgrid(u, v); 14 D=sqrt(U.^2+V.^2); 15 D0=80; %截至频率 16 H=double(D<=D0); %理想低通滤波器 17 J=fftshift(fft2(I, size(H, 1), size(H, 2))); %时域图像转换到频域;fftshift将零频点移到频谱的中间 18 K=J.*H; %滤波处理 19 L=ifft2(ifftshift(K)); %傅里叶反变换 20 L=L(1:size(I,1), 1:size(I, 2)); %滤波后图像 21 22 % 2.巴特沃斯低通滤波器 23 %n越大滤波器形状越陡峭 24 I=imread('liftingbody.png'); 25 I=im2double(I); 26 M=2*size(I,1); 27 N=2*size(I,2); 28 u=-M/2:(M/2-1); 29 v=-N/2:(N/2-1); 30 [U,V]=meshgrid(u, v); 31 D=sqrt(U.^2+V.^2); 32 D0=50; %截至频率 33 n=6; %滤波器的阶数 34 H=1./(1+(D./D0).^(2*n)); %设计巴特沃斯滤波器 35 J=fftshift(fft2(I, size(H, 1), size(H, 2))); %转换到频域 36 K=J.*H; %频域处理 37 L=ifft2(ifftshift(K)); %傅里叶反变换 38 L=L(1:size(I,1), 1:size(I, 2)); %改变图像大小 39 40 % 3.高斯低通滤波器 41 42 %---------高通滤波--------- 43 44 %使图像得到锐化处理,突出图像的边界;把信息丰富的低频去掉了,丢失了很多必要的信息;一般情况,高通滤波对噪声没有任何抑制作用 45 %为了既加强图像的细节又抑制噪声,可以采用高频加强滤波,实际上是由一个高通滤波器和一个全通滤波器构成的 46 47 % 1.理想高通滤波器 48 49 % 2.巴特沃斯高通滤波器 50 I=imread('rice.png'); 51 I=im2double(I); 52 M=2*size(I,1); 53 N=2*size(I,2); 54 u=-M/2:(M/2-1); 55 v=-N/2:(N/2-1); 56 [U,V]=meshgrid(u, v); 57 D=sqrt(U.^2+V.^2); 58 D0=30; 59 n=6; 60 H=1./(1+(D0./D).^(2*n)); 61 J=fftshift(fft2(I, size(H, 1), size(H, 2))); 62 K=J.*H; 63 L=ifft2(ifftshift(K)); 64 L=L(1:size(I,1), 1:size(I, 2)); 65 66 % 3.高斯高通滤波器 67 I=imread('coins.png'); 68 I=im2double(I); 69 M=2*size(I,1); 70 N=2*size(I,2); 71 u=-M/2:(M/2-1); 72 v=-N/2:(N/2-1); 73 [U,V]=meshgrid(u, v); 74 D=sqrt(U.^2+V.^2); 75 D0=20; 76 H=1-exp(-(D.^2)./(2*(D0^2))); 77 J=fftshift(fft2(I, size(H, 1), size(H, 2))); 78 K=J.*H; 79 L=ifft2(ifftshift(K)); 80 L=L(1:size(I,1), 1:size(I, 2)); 81 82 %---------带阻滤波器--------- 83 84 % 1.理想带阻滤波器 85 I=imread('coins.png'); 86 I=imnoise(I, 'gaussian', 0, 0.01); 87 I=im2double(I); 88 M=2*size(I,1); 89 N=2*size(I,2); 90 u=-M/2:(M/2-1); 91 v=-N/2:(N/2-1); 92 [U,V]=meshgrid(u, v); 93 D=sqrt(U.^2+V.^2); 94 D0=50; 95 W=30; %滤波器的带宽 96 H=double(or(D<(D0-W/2), D>D0+W/2)); 97 J=fftshift(fft2(I, size(H, 1), size(H, 2))); 98 K=J.*H; 99 L=ifft2(ifftshift(K)); 100 L=L(1:size(I,1), 1:size(I, 2)); 101 102 % 2.巴特沃斯带阻滤波器 103 104 % 3.高斯带阻滤波器 105 106 %---------同态滤波器--------- 107 108 %可用于压缩图像灰度的动态范围,且增强对比度 109 110 %图像由照射分量和反射分量相乘表示,照射分量和光源有关,通常用来表示慢的动态变化,决定一幅图像中像素能达到的动态范围;反射分量由物体本身特性决定,表示灰度的急剧变化部分;照射分量和傅里叶变换后的低频分量相关,反射分量和高频分量相关 111 %同态滤波就是选择合适的频域滤波器对图像的低频和高频分量分别进行不同的处理,成为同态滤波 112 I=imread('pout.tif'); 113 J=log(im2double(I)+1); %取对数 114 K=fft2(J); %傅里叶变换 115 n=5; %同态滤波参数 116 D0=0.1*pi; 117 rh=0.7; 118 rl=0.4; 119 [row, column]=size(J); 120 for i=1:row %设计滤波器矩阵 121 for j=1:column 122 D1(i,j)=sqrt(i^2+j^2); 123 H(i,j)=rl+(rh/(1+(D0/D1(i,j))^(2*n))); 124 end 125 end 126 L=K.*H; %滤波 127 M=ifft2(L); %傅里叶反变换 128 N=exp(M)-1; %取指数