首先把图像转换成与Matlab基本代数符类型相容的双精度浮点型,再利用Matlab的代数运算符实现图像的代数运算。
>> i=imread('rice.png');
>> j=imread('cameraman.tif');
>> k=imadd(i,j,'uint16');
>> subplot(1,3,1);imshow(i);title('原始图像rice');
>> subplot(1,3,2);imshow(j);title('原始图像cameraman');
>> subplot(1,3,3);imshow(k);title('两幅图像叠加');
>> subplot(1,3,3);imshow(k,[]);title('两幅图像叠加');
imshow(K)直接显示灰度图像K
imshow(K,[])显示K,并将K的最大值和最小值分别作为纯白(255)和纯黑(0),中间的K值映射为0-255之间的标准灰度值。
>> i=imread('eight.tif');
>> j=imnoise(i,'salt & pepper',0.04);
>> subplot(1,2,1);imshow(i);title('原始图像');
>> subplot(1,2,2);imshow(j);title('添加椒盐噪声的图像');
利用多图像的平均可以降低图像的噪声
对于原图像,假设有一个噪声图像集:
一般噪声满足零期望:
如果用均值来估计噪声分布的期望,则有:
所以可以降低图像的噪声。
>> i=imread('eight.tif');
>> j1=imnoise(i,'gaussian',0,0.006);
>> j2=imnoise(i,'gaussian',0,0.006);
>> j3=imnoise(i,'gaussian',0,0.006);
>> j4=imnoise(i,'gaussian',0,0.006);
>> K=imlincomb(0.3,j1,0.3,j2,0.3,j3,0.3,j4);%线性组合
>> figure;
>> subplot(1,3,1);imshow(i);title('原始图像');
>> subplot(1,3,2);imshow(j1);title('添加高斯噪声的图像');
>> subplot(1,3,3);imshow(K,[]);title('抑制高斯噪声的图像');
>> i=imread('rice.png');
>> background=imopen(i,strel('disk',15));
>> j=imsubtract(i,background);
>> figure;
>> subplot(1,3,1);imshow(i);title('原始图像rice');
>> subplot(1,3,2);imshow(background);title('背景图像');
>> subplot(1,3,3);imshow(j,[]);title('去除背景的图像');
减法操作时有时会导致某些像素值为负数,这时函数会自动截取为0,也可以调用imabsdiff函数实现。
i=imread('cameraman.tif');
subplot(1,3,1);imshow(i);title('原始图像');
j=uint8(filter2(fspecial('gaussian'),i));
subplot(1,3,2);imshow(j);title('含噪图像');
k=imabsdiff(i,j);
subplot(1,3,3);imshow(k,[]);title('两幅图像相减');
i=imread('eight1.png');
j=imread('eight.png');
k=imabsdiff(i,j);
figure;
subplot(1,3,1);imshow(i);title('T1时刻的状态');
subplot(1,3,2);imshow(j);title('T2时刻的状态');
subplot(1,3,3);imshow(k);title('两个时刻的状态区别');
>> i0=imread('rice.png');
>> i=rgb2gray(i0);
>>subplot(2,2,1);imshow(i);title('原始图像');
>>i16=uint16(i);
>>j=immultiplt(i);
>>subplot(2,2,2);imshow(j);title('图像自身相乘效果');
>>k=immultiply(i,0.65);
>>subplot(2,2,3);imshow(k);title('图像与常数0.65相乘效果');
>>k=immultiply(i,3);
>>subplot(2,2,4);imshow(k);title('图像与常数3相乘效果');
>> i0=imread('street.jpg');
>>j0=imread('street1.jpg');
>>i=rgb2gray(i0);
>>j=rgb2gray(j0);
>>subplot(2,3,1);imshow(i0);title('原始彩色图像');
>>subplot(2,3,2);imshow(j0);title('反色彩色图像');
>>subplot(2,3,3);imshow(i);title('原始灰度图像');
>>k=imdivide(j,i);
>>k1=imdivie(i,0.3);
>>k2=imdivide(i,1.2);
>>subplot(2,3,4);imshow(k);title('图像相除的效果');
>>subplot(2,3,5);imshow(k1);title('图像与常数0.65相除的效果');
>>subplot(2,3,6);imshow(k2);title('图像与常数3相除的效果');
对图像的像素进行处理时,不仅需要输入该像素本身的灰度,还要输入以该像素为中心某局部区域的一些像素的灰度进行运算的方式,称为图像邻域运算
>> A=imread('cameraman.tif');
>> A=im2double(A);
>> fun=@(x)median(x(:));
>> B=nlfilter(A,[3,3],fun);
>> subplot(1,2,1);imshow(A);title('原始图像');
>> subplot(1,2,2);imshow(B);title('邻域操作');
当进行滑动邻域操作的时候,可以使用列处理来加快处理的速度。
在matlab中,进行列处理的函数为colfilt,可以实现:
>> A=imread('cameraman.tif');
>>A=im2double(A);
>> fun=@(x)ones(9,1)*median(x);
>> B=colfilt(A,[3 3],'distinct',fun);
>> subplot(1,2,1);imshow(A);title('原始图像');
>>subplot(1,2,2);imshow(B);title('快速邻域操作');
通过把输入图像的像素的位置映射到一个新位置达到改变原图像显示效果的目的,称为图像的几何运算。
>>i=imread('football.jpg');
>> subplot(3,2,1);imshow(i);title('原始图像');
>> i1=imrotate(i,60);
>> i2=imrotate(i,-30);
>> i3=imrotate(i,60,'bicubic','crop');
>> i4=imrotate(i,-30,'bicubic','loose');
>> subplot(3,2,3);imshow(i1);title('逆时针旋转60度');
>> subplot(3,2,4);imshow(i2);title('顺时针旋转30度');
>> subplot(3,2,5);imshow(i3);title('裁剪逆时针旋转60度');
>> subplot(3,2,6);imshow(i4);title('裁剪顺时针旋转30度');
>> i=imread('football.jpg');
>> figure:imshow(i);title('原始图像');
>> j=imresize(i,0.125);
>> figure:imshow(j);title('缩小的图像');
2. 比例放大变换
一般采用灰度插值法对图像进行放大
Matlab提供三种插值法:
- [ ] 最近邻插值
- [ ] 双线性插值法
- [ ] 双三次插值法
Matlab提供interp2函数用于图像的插值,格式为:
>> i=imread('football.jpg');
>> j=imresize(i,0.125);
>> j=rgb2gray(j);
>> j1=interp2(j,8,'nearest');%最近邻插值
>> j1=uint8(j1);
>> subplot(2,2,1);imshow(j1);title('最近邻插值');
>> j2=interp2(double(j),8,'linear');
>> j2=uint8(j2);subplot(2,2,2);imshow(j2);title('线性插值');
>> j3=interp2(double(j),8,'spline');
>> j3=uint8(j3);subplot(2,2,4);imshow(j3);title('三次样条插值');
>> j4=interp2(double(j),8,'cubic');
>> j4=uint8(j4);subplot(2,2,3);imshow(j4);title('立方插值');
Z:需要插值的图像
Ntimes:放大的倍数
Method:可选的参数,插值的方法
>> i=imread('football.jpg');
>> i1=double(i);
>> subplot(2,2,1);imshow(uint8(i1));title('原始图像');
>> H=size(i1);
>> i2(1:H(1),1:H(2),1:H(3))=i1(H(1):-1:1,1:H(2),1:H(3));
>> subplot(2,2,2);imshow(uint8(i2));title('垂直图像');
>> i3(1:H(1),1:H(2),1:H(3))=i1(1:H(1),H(2):-1:1,1:H(3));
>> subplot(2,2,3);imshow(uint8(i3));title('水平图像');
>> i4(1:H(1),1:H(2),1:H(3))=i1(H(1):-1:1,H(2):-1:1,1:H(3));
>> subplot(2,2,4);imshow(uint8(i4));title('对角图像');
矩阵变换表示:
Matlab没有提供专门的函数实现图像的平移,需要自定义平移函数。
不考虑溢出函数:
function J = translation(I,a,b)
%I为输入图像,a,b描述I沿着X轴、Y轴移动距离
%不考虑溢出情况
[M,N,G]=size(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
主程序:
>> i=imread('football.jpg');
>> a=90;b=90;
>> j1=translation(i,a,b);subplot(2,2,1);imshow(j1);axis on;title('右下平移图像');
>> a=-90;b=-90;
>> j2=translation(i,a,b);subplot(2,2,2);imshow(j2);axis on;title('左上平移图像');
>> a=-90;b=90;
>> j3=translation(i,a,b);subplot(2,2,3);imshow(j3);axis on;title('右上平移图像');
>> a=90;b=-90;
>> j4=translation(i,a,b);subplot(2,2,4);imshow(j4);axis on;title('左下平移图像');
function J = translation(I,a,b)
%I为输入图像,a,b描述I沿着X轴、Y轴移动距离
%考虑溢出情况,采用扩大显示区域的方法
[M,N,G]=size(I);
I=im2double(I);%将图像数据类型转换为双精度
J=ones(M+abs(a),N+abs(b),G);%初始化新的图像矩阵为全1矩阵,大小根据xy平移的范围确定
for i=1:M;
for j=1:N;
if(a<0&&b<0)
J(i,j,:)=I(i,j,:);%如果进行左上移动,对新图像矩阵进行赋值
elseif(a>0&&b>0)
J(i+a,j+b,:)=I(i,j,:);%如果进行右下移动,对新图像矩阵进行赋值
elseif(a>0&&b<0)
J(i+a,j,:)=I(i,j,:);%如果进行右上移动,对新图像矩阵进行赋值
else
J(i,j+b,:)=I(i,j,:);%如果进行左下移动,对新图像矩阵进行赋值
end
end
end