图像基本运算
1点运算
线性点运算是指输入图像的灰度级与输出图像呈线性关系。
s=ar+b
(r为输入灰度值,s为相应点的输出灰度值)。
当a=1,b=0时,新图像与原图像相同;
当a=1,b≠0时,新图像是原图像所有像素的灰度值上移或下移,是整个图像在显示时更亮或更暗;
当a>1时,新图像对比度增加;
当a<1时,新图像对比度降低;
当a<0时,暗区域将变亮,亮区域将变暗,点运算完成了图像求补;
非线性点运算是指输入与输出为非线性关系,常见的非线性灰度变换为对数变换和幂次变换,对数变换一般形式为:
1 x=imread('D:/picture/DiaoChan.jpg'); 2 subplot(2,2,1) 3 imshow(x); 4 title('原图'); 5 J=0.3*x+50/255; 6 subplot(2,2,2); 7 imshow(J); 8 title('线性点变换'); 9 subplot(2,2,3); 10 x1=im2double(x); 11 H=2*log(1+x1); 12 imshow(H) 13 title('非线性点运算');%对数运算
幂次变换一般形式:s=cr^γ
下面是非线性点运算的幂运算
1 I=imread('D:/picture/DiaoChan.jpg'); 2 subplot(2,2,1); 3 imshow(I);title('原始图像','fontsize',9); 4 subplot(2,2,2); 5 imshow(imadjust(I,[],[],0.5));title('Gamma=0.5'); 6 subplot(2,2,3); 7 imshow(imadjust(I,[],[],1));title('Gamma=1'); 8 subplot(2,2,4); 9 imshow(imadjust(I,[],[],1.5));title('Gamma=1.5');
2代数运算和逻辑运算
加法运算去噪处理
1 clear all 2 i=imread('lenagray.jpg'); 3 imshow(i) 4 j=imnoise(i,'gaussian',0,0.05); 5 [m,n]=size(i); 6 k=zeros(m,n); 7 for l=1:100 8 j=imnoise(i,'gaussian',0,0.05); 9 j1=im2double(j); 10 k=k+j1; 11 End 12 k=k/100; 13 subplot(1,3,1),imshow(i),title('原始图像') 14 subplot(1,3,2),imshow(j),title('加噪图像') 15 subplot(1,3,3),imshow(k),title(‘求平均后的
减法运算提取噪声
1 I=imread(‘lena.jpg’); 2 J=imnoise (I,‘lena.jpg’,0,0.02); 3 K=imsubtract(J,I); 4 K1=255-K; 5 figure;imshow(I); 6 figure;imshow(J); 7 figure;imshow(K1);
乘法运算改变图像灰度级
1 I=imread('D:/picture/SunShangXiang.jpg') 2 I=im2double(I); 3 J=immultiply(I,1.2); 4 K=immultiply(I,2); 5 subplot(1,3,1),imshow(I);subplot(1,3,2),imshow(J); 6 subplot(1,3,3);imshow(K);
逻辑运算
1 A=zeros(128); 2 A(40:67,60:100)=1; 3 figure(1) 4 imshow(A); 5 B=zeros(128); 6 B(50:80,40:70)=1; 7 figure(2) 8 imshow(2); 9 C=and(A,B);%与 10 figure(3); 11 imshow(3); 12 D=or(A,B);%或 13 figure(4); 14 imshow(4); 15 E=not(A);%非 16 figure(5); 17 imshow(E);
3几何运算
平移运算实现图像的平移
1 I=imread('lenagray.jpg'); 2 subplot(1,2,1); 3 imshow(I); 4 [M,N]=size(I);g=zeros(M,N); 5 a=20;b=20; 6 for i=1:M 7 for j=1:N 8 if((i-a>0)&(i-a<M)&(j-b>0)&(j-b<N)) 9 g(i,j)=I(i-a,j-b); 10 else 11 g(i,j)=0; 12 end 13 end 14 end 15 subplot(1,2,2);imshow(uint8(g));
水平镜像变换
1 I=imread('lena.jpg'); 2 subplot(121);imshow(I); 3 [M,N]=size(I);g=zeros(M,N); 4 for i=1:M 5 for j=1:N 6 g(i,j)=I(i,N-j+1); 7 end 8 end 9 subplot(122);imshow(uint8(g));
垂直镜像变换
1 I=imread('lena.jpg'); 2 subplot(121);imshow(I); 3 [M,N]=size(I);g=zeros(M,N); 4 for i=1:M 5 for j=1:N 6 g(i,j)=I(M-i+1,j); 7 end 8 end 9 subplot(122);imshow(uint8(g));
图像的旋转
1 x=imread('D:/picture/DiaoChan.jpg'); 2 imshow(x); 3 j=imrotate(x,45,'bilinear'); 4 k=imrotate(x,45,'bilinear','crop'); 5 subplot(1,3,1),imshow(x); 6 title(‘原图') 7 subplot(1,3,2),imshow(j); 8 title(‘旋转图(显示全部)') 9 subplot(1,3,3),imshow(k); 10 title(‘旋转图(截取局部)')
几种插值法比较
1 i=imread('lena.jpg'); 2 j1=imresize(i,10,'nearest'); 3 j2=imresize(i,10,'bilinear'); 4 j3=imresize(i,10,'bicubic'); 5 subplot(1,4,1),imshow(i);title(‘原始图像') 6 subplot(1,4,2),imshow(j1);title(‘最近邻法') 7 subplot(1,4,3),imshow(j2);title(‘双线性插值法') 8 subplot(1,4,4),imshow(j3);title(‘三次内插法')
放缩变换
1 x=imread('D:/picture/ZiXia.jpg') 2 subplot(2,3,1) 3 imshow(x); 4 title('原图'); 5 Large=imresize(x,1.5); 6 subplot(2,3,2) 7 imshow(Large); 8 title('扩大为1.5'); 9 Small=imresize(x,0.1); 10 subplot(2,3,3) 11 imshow(Small); 12 title('缩小为0.3'); 13 subplot(2,3,4) 14 df=imresize(x,[600 700],'nearest'); 15 imshow(df) 16 title('600*700'); 17 df1=imresize(x,[300 400],'nearest'); 18 subplot(2,3,5) 19 imshow(df1) 20 title('300*400');
后记:
(1)MATLAB基础知识回顾
1:crtl+R是对选中的区域注释,ctrl+T是取消注释
2:有的代码中点运算如O=a.*I+b/255 ,其中b除以255原因是:灰度数据有两种表式方法:一种是用unit8类型,取值0~255;另一种是double类型,取值0~1。两者之间相差255倍。就这段代码而言,I刚读入时是unit8类型,在第2句转换为double,所以后面涉及到与它进行运算的时候,为了统一,都要转换到0~1的范围,所以要除255。
3:imresize的用法
1、B = imresize(A,m) 将图片A放大m倍
2、B = imresize(A,m,method)
将图片A由参数method指定的插值运算方法来改变图像的大小到m倍,
method的几种可选值:
'nearest'最近邻插值(默认)
'bilinear'双线性插值
'bicubic'双三次插值
3、B = imresize(A,[mrows
ncols],method) 将图片A由参数method指定的插值运算方法,来改变图像的大小到长宽为[mrows
ncols]
4、B= imresize(...,method,n)
5、B= imresize(...,method,h)
其中的h可以是任意一个FIR滤波器(h通常由函数ftrans2、fwind1、fwind2、或fsamp2等生成的二维FIR滤波器)。
4:uint16的用法
matlab中uint16函数的用法;
1.函数用法:将输入参数映射到无符号16位范围之内,即将参数限定在0-65535之间;
2.实例:当输入为一个实数a时:
if a<0 输出ans=0;
if 0<=a<=65535 输出ans=a;
if a>65535 输出ans=65535;
当输入为一个矩阵a时:对于矩阵中的每一个元素进行上述标量操作;
if a=[-1 2 65539] 输出ans=[0 2 65535];
注意:uint8的用法同理
5 mat2gray 把一个double类的任意数组转换成值范围在[0,1]的归一化double类数组
im2double 将输入转换为double类.若输入是uint8类 uint16 类 logical类则函数将其转换为范围[0,1]之间的类.
6imadjust
函数imadjust是对灰度图像进行亮度转换的基本IPT工具
g=imadjust(f,[low-in high-in],[low_out high_out],gmma)
此函数将图像f中的亮度值映像到g中的新值,即将low_in至high_in之间的值的映射到low_out和high_out之间的值.low_in以下high_in以 上的值被剪切了. 参数gamma给出曲线的形状.该曲线用来映射f的亮度值,以便生成图像g.若gamma小于
1,则映射被加权至更高的输出值.
7imnoise的用法
g = imnoise(f, type, parameters)
参数说明:
输出:g是添加噪声之后的图像。
输入:f是原图像,type是加入的噪声类型,parameters是噪声的一些参数。