图像的代数运算是指将两幅或多幅图像通过对应像素之间的加、减、乘、除运算得到输出图像的方法。
需要说明的是,在 MATLAB中图像数据类型是uint8,当进行代数运算时有可能产生属性溢出,所以应当在进行图像代数运算之前首先将数据类型转换成double,从而保证结果的准确性。
1、图像的加法运算
图像加法运算的一个应用是将一幅图像的内容叠加到另一幅图像上,生成叠加图像效果,或给图像中每个像素叠加常数改变图像的亮度。在MATLAB图像处理工具箱中提供的函数imadd( )可实现两幅图像的相加或者一幅图像和常量的相加,其具体的调用格式如下:
- Z=imadd(X,Y):该函数中X和Y为大小相等图像矩阵,它们相加的结果返回给Z。
- Z=imadd(X,Y):若该函数中X为图像,Y为常数,则它们相加的结果为图像X中每个像素增加常数Y并返回给Z。
若叠加的两个图像大小不等,可采用for循环语句进行逐点叠加,即
for i=1:m for j=1:n C(i,j)=A(i,j)+B(i,j); end end
图像加法运算的另一重要应用是通过同一幅图像叠加取平均,消除原图像中的附加噪声【基本原理可看《MATLAB图像处理实例详解》P128】,在MATLAB图像处理工具箱中提供了函数 imnoise( )实现在图像中加入噪声,其具体的调用格式如下:
- J=imnoise(Ⅰ,type,parameters):该函数是对图像Ⅰ添加典型噪声后生成的有噪图像,结果返回给J。其中I为原始图像;type为添加的噪声类型,取值可以是高斯噪声gaussian、零均值的高斯噪声localvar、泊松噪声poisson、椒盐噪声salt & pepper和乘性噪声speckle;Parameters指不同类型的噪声的参数。
2、图像的减法运算
图像减法也称为差分方法,是一种常用于检测图像变化及运动物体的图像处理方法。常用来检测一系列相同场景图像的差异,其主要的应用在于检测同一场景下两幅图像之间的变化或是混合图像的分离。
在MATLAB图像处理工具箱中提供了函数 imsubtract( ),可以将一幅图像从另一幅图像中减去,或者从一幅图像中减去一个常数,实现将一幅输入图像的像素值从另一幅输入图像相应的像素值中减去,再将这个结果作为输出图像相应的像素值,其具体的调用格式如下:
- Z=imsubtract(X,Y):该函数中X和Y表示进行图像减法运算的两幅图像,Z表示X-Y后的操作结果。
- Z=imsubtract(X,Y):若该函数中X为图像,Y为常数,则图像X中每个像素减去常数Y
为了避免差值产生负值,同时避免像素值运算结果之间产生差异,采用了MATLAB图像处理工具箱提供的函数imabsdiff( ),计算两幅图像相应像素差值的绝对值,返回结果不会产生负数,其调用形式与函数 imsubtract( )类似,可自行查阅MATLAB帮助文件。
3、图像的乘法运算
两幅图像进行乘法运算主要实现两个功能:一是可以实现掩模操作,即屏蔽图像的某些部分;二是如果一幅图像乘以一个常数因子,如果常数因子大于1,将增强图像的亮度,如果因子小于1则会使图像变暗。
在MATLAB图像工具箱中提供了函数immultiply( )实现两幅图像的乘法,该函数将两幅图像相应的像素值进行元素对元素的乘法操作(相当于MATLAB中矩阵的点乘),并将乘法的运算结果作为输出图形相应的像素值,其具体的调用格式如下:
- Z=immulitply(X,Y):该函数中X和Y表示进行图像乘法运算的两幅图像,Z表示X×Y后的操作结果。
4、图像的除法运算
图像的除法运算给出的是两幅图像相应像素值的变化比率,而不是每个像素的绝对差异,因而图像除法也称为比率变换,常用于校正成像设备的非线性影响。在 MATLAB 图像处理工具箱中提供了函数 individe( )实现两幅图像的除法,该函数对两幅输入图像的所有相应像素执行元素对元素的除法操作(即 MATLAB中矩阵的点除操作),并将得到的结果作为输出图像的相应像素值,其具体的调用格式如下:
- Z=imdivide(X,Y):该函数中两幅图像X和Y进行除法,结果返回给Z。
- 图像与常数相除也可实现亮度调解,如 X÷0.5=X×2
注:两幅图像的像素值代数运算时产生的结果很可能超过图像数据类型所支持的最大值,尤其对于uint8类型的图像,溢出情况最为常见。当数据值发生溢出时,MATLAB将数据截取为数据类型所支持的最大值,这种截取效果称之为饱和。为了避免出现饱和现象,在进行代数计算前最好将图像转换为一种数据范围较宽的数据类型。例如,在加法操作前将uint8图像转换为double类型。
5、其他的一些代数图像代数运算
(1)绝对值差函数 imabsdiff( )
- Z = imabsdiff(X,Y):该函数是执行图像矩阵X和图像矩阵中对应位置的元素相减,并取绝对值,结果返回给Z。X和Y是具有相同大小和数据类型的实数或非稀疏矩阵,如果X和均是整数矩阵,运算结果超过范围将被截断;如果X和Y是double类型的矩阵,则可以使用Z=abs(X-Y)与当前调用方式一样。
(2)图像求补函数 imcomplement( )
- IM2 = imcomplement(IM):该函数是求图像矩阵IM的所有元素求补,结果返回给IM2。图像矩阵IM可以是二值图像、灰度图像或RGB 图像。如果IM是二值图像矩阵,求补后相应元素中'0'变'1','1'变'0';如果M是灰度图像或RGB图像,则求补结果为IM矩阵数据类型的最大值与对应像素值相减的差值。结果矩阵 IM2和输入图像矩阵IM是具有同样大小和数据类型的矩阵。
(3)图像运算的线性组合函数 imlincomb( )
- Z = imlincomb(K1,A1,K2,A2....,Kn,An):该函数是计算图像矩阵A1,A42,...,An按照系数K1,K2,...,Kn 的加权和,计算结果K1*A1+K2*A2...Kn*An返回给Z。其中,图像矩阵A1,A2,..., An是实数、非稀疏矩阵,系数K1,K2,...,Kn是实数或双精度标量;返回结果矩阵Z大小与图像A1大小相等。
- Z = imlincomb(K1,A1,K2,A2....Kn,An,K):该函数是计算K1*A1+K2*A2....Kn*An+K,结果返回给Z。其中参数含义及类型与Z = imlincomb(K1,A1,K2,A2,...,Kn,An)调用方式相同。
图像的逻辑运算主要是针对二值图像,以像素对像素为基础进行的两幅或多幅图像间的操作。常用的逻辑运算有与、或、非、或非、与非和异或等。在 MATLAB中,提供了逻辑操作符与(&)、或(|)、非(~)和异或(OR)等进行逻辑运算,复杂逻辑运算可通过基本运算推导得到。
编写用于图像移动的函数 move.m:
%定义一个函数名字move,I表示输入图像,a和b描述工图像沿着x轴和y轴移动的距离
%图像移出的部分会被截断
function J=move(I,a,b)
[M,N,G]=size(I) ; %获取输入图像I的大小
I=im2double(I); %将图像数据类型转换成双精度
J=ones(M,N,G); %初始化新图像矩阵全为1,大小与输入图像相同,图像溢出后,找不到对应点的地方都赋值为1,即背景为白色
%J=zeros(M,N,G); %初始化新图像矩阵全为0,大小与输入图像相同,图像溢出后,找不到对应点的地方都赋值为0,即背景为黑色
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
此时点击【运行】若出现一下错误,不影响函数调用:
另一种用于图像移动的函数 move1.m:
%定义一个函数名字move1,I表示输入图像,a和b描述工图像沿着x轴和y轴移动的距离号考虑平移以后图像溢出情况,采用扩大显示区域的方法
%移出的部分不会被截断,但移动后的图像多出一部分移动距离的区域,输出图像与输入图像大小不等
function J=move1(I,a,b)
[M,N,G]=size(I); %获取输入图像工的大小
I=im2double(I); %将图像数据类型转换成双精度
J=ones(M+abs(a),N+abs(b),G); %初始化新图像矩阵全为1,大小为输入图像+移动距离,背景为白色
%J=zeros(M+abs(a),N+abs(b),G); %初始化新图像矩阵全为0,大小为输入图像+移动距离,背景为黑色
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
图像的镜像分为两种垂直镜像和水平镜像,其中水平镜像是指图像的左半部分和右半部分以图像竖直中轴线为中心轴进行对换。垂直镜像是指图像的上半部分和下半部分以图像水平中轴线为中心轴进行对换。
编写图像镜像的函数mirror.m,具体代码如下
%mirror函数实现图像镜像变换功能
%参数n为1时,实现水平镜像变换号
%参数n为2时,实现垂直镜像变换号
%参数n为3时,实现水平垂直镜像变换
function OutImage=mirror(InImage,n)
I=InImage;
[M, N,G] =size(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
else
if (n==2)
for i=1:M
for j=1:N
J(i,j,:)=I(i,N-j+1,:); %n=2,垂直镜像
end
end
else
if(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
end
end
OutImage=J ;