当a=1,b=0时,输出图像就是输入图像的简单复制;
当a=1,b≠0时,输出图像在整体效果上比输入图像要明亮或灰暗。
当a=-1,b=0时,产生负象
【例】线性点运算
rice=imread('rice.png');
I=double(rice);
J=I*0.43+60;
rice2=uint8(J);
subplot(1,2,1),imshow(rice);
subplot(1,2,2),imshow(rice2);
【例】负象
rice=imread('rice.png');
I=double(rice);
J=-1*I;
subplot(1,2,1),imshow(I,[]);
subplot(1,2,2),imshow(J,[]);
3、非线性点运算
非线性点运算对应与非线性的灰度变换函数。
下图是几种典型的非线性点运算。
阈值处理和直方图均匀化,是两种典型的非线性运算,以后介绍。
三、图像的代数运算
1、概述
图像的代数运算是两幅输入图像之间进行点对点的加、减、乘、除运算后得到输出图像的过程。
设输入图像为A(x,y)、B(x,y),输出图像为C(x,y),则图像的代数运算有如下四种形式:
C(x,y)=A(x,y)+B(x,y)
C(x,y)=A(x,y)-B(x,y)
C(x,y)=A(x,y)×B(x,y)
C(x,y)=A(x,y)÷B(x,y)
图像的代数运算在图像处理中有着广泛的应用,它除了可以实现自身所需的算术操作,还能为许多复杂的图像处理提供准备。
例如,图像减法就可以用来检测同一场景或物体生成的两幅或多幅图像的误差。
我们可以使用MATLAB基本算术符(+、-、×、÷等)来执行图像的算术操作,但是在此之前必须将图像转换为适合进行基本操作的双精度类型。
图像处理工具箱包含了一个能实现所有数值数据的算术操作的函数集合。
列举如下:
函数名
功能描述
Imabsdiif
两幅图像的绝对差值
Imadd
两个图像的加法
imcomplment
补足一幅图像
imdivide
两个图像的除法
imlincomb
计算两幅图像的线形组合
lmmultiply
两个图像的乘法
Imsubtract
两个图像的减法
使用图像工具箱中的图像代数运算函数无需再进行数据类型间的转换,这些函数能够接受uint8和uintl6数据,并返回相同格式的图像结果。
图像的代数运算函数使用以下截取规则使运算结果符合数据范围的要求:
超出数据范围的整型数据将被截取为数据范围的极值,分数结果将被四舍五入。
例如,如果数据类型是uint8,那么大于255的结果(包括无穷大inf)将被设置为255。
无论进行哪一种代数运算都要保证两幅输入图像的大小相等,且类型相同。
2、图像的加法
MATLAB中调用imadd函数实现图像相加,格式如下:
Z=imadd(X,Y);其中Z=X+Y。
【例】使用加法操作将两幅图像叠加在一起
I=imread('rice.png');
J=imread('cameraman.tif');
K=imadd(I,J);
subplot(2,2,1);imshow(I);
subplot(2,2,2);imshow(J);
subplot(2,2,3);imshow(K);
【例】增加RGB图像的亮度
RGB=imread('onion.png');
RGB2=imadd(RGB,50);
subplot(1,2,1),imshow(RGB);
subplot(1,2,2),imshow(RGB2);
为了避免出现饱和现象,在进行加法计算前最好将图像转换为一种数据范围较宽的数据类型。
3、图像的减法
图像减法也称为差分方法,MATLAB中调用imsubtract函数实现图像相减。
调用格式如下:
Z=imsubtract(X,Y);其中Z=X-Y。
【例】减去不均匀背景
rice=imread('rice.png');
background=imopen(rice,strel('disk',15));
rice2=imsubtract(rice,background);
subplot(1,2,1),imshow(rice);
subplot(1,2,2),imshow(rice2);
【例】降低RGB图像的亮度
RGB=imread('onion.png');
RGB2=imsubtract(RGB,50);
subplot(1,2,1),imshow(RGB);
subplot(1,2,2),imshow(RGB2);
4、图像的乘法
两幅图像进行乘法运算可以实现掩模操作,即屏蔽掉图像的某些部分。
一幅图像乘以一个常数通常被称为缩放。
如果使用的缩放因数大于1,那么将增强图像的亮度,如果因数小于1则会使图像变暗。
MATLAB中调用immultiply函数实现两幅图像相乘。
调用格式如下:
Z=immultiply(X,Y);其中Z=X×Y。
【例】象素值缩放
I=imread('moon.tif');
J=immultiply(I,1.2);
K=immultiply(I,0.6);
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(J);
subplot(1,3,3),imshow(K);
5、图像的除法
除法运算可用于校正成像设备的非线性影响。
MATLAB中调用imdivide函数进行两幅图像相除。
调用格式如下:
Z=imdivide(X,Y),其中Z=X÷Y。
【例】米粒图像除法运算
rice=imread('rice.png');
I=double(rice);
J=0.43*I+90;
Ip=imdivide(I,J);
subplot(2,2,1),imshow(uint8(I));
subplot(2,2,3),imshow(uint8(J));
subplot(2,2,4),imshow(uint8(Ip),[]);
6、图像四则运算
因对uint8、uintl6数据,每步运算都要进行数据截取,将会减少输出图像的信息量。
图像四则运算较好的办法是使用函数imlincomb。
该函数按双精度执行所有代数运算操作,仅对最后的输出结果进行截取,该函数的调用格式如下:
Z=imlincomb(A,X,B,Y,C),其中,Z=A×X+B×Y+C
Z=imlincomb(A,X,C),其中:
Z=A×X+C
Z=imlincomb(A,X,B,Y),其中:
Z=A×X+B×Y
【例】计算两幅图像的平均值
CLF
I1=imread('rice.png');
I2=imread('cameraman.tif');
%K=imdivide(imadd(I1,I2),2);
K=imlincomb(0.5,I1,0.5,I2);
subplot(2,2,1),subimage(I1);
subplot(2,2,2),subimage(I2);
subplot(2,2,3),subimage(K);
四、图像的几何运算
1、概述
几何运算与点运算不同,可以看成是像素在图像内的移动过程,该移动过程可以改变图像中物体对象(像素)之间的空间关系。
几何运算可以是不受任何限制的,但是通常都需要做出一些限制以保持图像的外观顺序。
完整的几何运算需要由两个算法来实现:
空间变换算法和灰度插值算法。
空间变换主要用来保持图像中曲线的连续性和物体的连通性,一般都采用数学函数形式来描述输入、输出图像相应像素间的空间关系。
空间变换的一般定义为
其中,f表示输入图像,g表示输出图像,坐标(x',y')指的是空间变换后的坐标,要注意这时的坐标已经不是原来的坐标(x,y)了。
a(x,y)和b(x,y)分别是图像的x和y坐标的空间变换函数。
灰度级插值主要是对空间变换后的像素赋予灰度值,使之恢复原位置处的灰度值。
在几何运算中,灰度级插值是必不可少的组成部分,因为图像一般用整数位置处的像素来定义。
而在几何变换中,g(x,y)的灰度值一般由处在非整数坐标上的f(x,y)的值来确定,即g中的一个像素一般对应于f中的几个像素之间的位置,反过来看也是一样,即f中的一个像素往往被映射到g中的几个像素之间的位置。
显然,要了解空间变换,首先就要对图像的坐标系统有一个清楚的了解。
MATLAB图像处理工具箱主要采用两种坐标系统:
像素坐标系统和空间坐标系统。
2、象素坐标系统
像素坐标系统下,图像被视为右图所示的离散元素网格,网格按照从上到下、从左到右的顺序排列。
对于像素坐标来说,第一个分量r(行)向下增长,第二个分量c(列)向右增长。
像素坐标是整型数值,数据范围在1到行或列长度之间。
像素坐标与MATLAB矩阵下标一一对应,这种对应关系有助于理解图像数据矩阵与图像显示之间的关系。
例如,图像第五行、第二列的像素值将保存在矩阵元素(5,2)中。
在像素坐标中,一个像素被理解为一个离散单元,由一个单独的坐标对唯一确定,根据这种定义方法,诸如(5.3,3.2)这样的位置是没有意义的。
3、空间坐标系统
如果将像素视为一个正方形,此时坐标(5.3,3.2)是有意义的,并且该位置与坐标(5,2)有区别。
右图说明了这种空间坐标系统的定义方法。
任何像素中心点的空间坐标都与该像素的像素坐标一致。
在像素坐标中,图像的左上角位置是(1,1),且始终为(1,1)。
在空间坐标中,该位置缺省情况下为(0.5,0.5),但是在空间坐标系统中可以使用一个任意的起始点。
例如,用户可以将图像的左上角指定为点(19.0,7.5),而不是(0.5,0.5)。
为了建立一个非缺省的空间坐标系统,可以在显示图像时指定图像的XDATA和YDATA属性,这两个属性都是由两个数值组成的向量,这两个数值分别表示第一个和最后一个像素的中心点坐标。
【例】使用非缺省的XDATA和YDATA显示图像
CLF
A=magic(5);
x=[19.523.5];
y=[8.012.0];
image(A,'xdata',x,'ydata',y);
axisimage;
colormap(jet(25));
缺省情况下,图像A的XDATA属性为[1,size(A,2)],而YDATA属性为[1,size(A,1)]。
显然,真实的坐标延伸范围略大于这两个数值间的距离。
像素坐标与空间坐标另一个容易混淆的地方在于,两个坐标系统的水平分量符号和垂直分量符号是一种逆转关系,像素坐标从左到右表示图像列的方向,而空间坐标从左到右则相当于图像行的方向。
以后,以r和c作为下标的函数采用的是像素坐标系统,而以x和y作为下标的函数采用的是空间坐标系统。
4、灰度级插值
实现几何运算有两种方法:
其一为前向映射法,即将输入像素的灰度一个个地转移到输出图像中,如果一个输入像素被映射到四个输出像素之间的位置,则其灰度值就按插值法在四个输出像素之间进行分配;
其二为后向映射法(像素填充法),这时将输出像素逐个地映射回输入图像中,若输出像素被映射到四个输入像素之间的位置,则其灰度由它们的插值来确定。
在实际中,通常采用后向映射法。
灰度级插值是用来估计像素在图像像素间某一位置处取值的过程。
例如,如果用户修改了一幅图像的大小,使其包含比原始像素更多的像素,那么必须使用插值方法计算其额外像素的灰度取值。
灰度级插值的方法有很多种,但是插值操作的方式都是相同的。
无论使用何种插值方法,首先都需要找到与输出图像像素相对应的输入图像点,然后再通过计算该点附近某一像素集合的权平均值来指定输出像素的灰度值。
像素的权是根据像素到点的距离而定的,不同插值方法的区别就在于所考虑的像素集合不同。
最近邻插值nearest-输出像素将被指定为像素点所在位置处的像素值;
双线性插值bilinear-输出像素值是像素2×2邻域内的权平均值;
双三次插值bicubic-输出像素值是像素4×4邻域内的权平均值。
最近邻插值不够精确。
双线性插值利用(x,y)点的四个最近邻像素的灰度值,按照以下方法计算(x,y)点的灰度值。
设输出图像的宽度为W,高度为H,输入图像的宽度为w,高度为h,按照线形插值的方法,将输入图像的宽度方向分为W等份,高度方向分为H等份,那么输出图像中任意一点(x,y)的灰度值就应该由输入图像中四点(a,b)、(a+1,b)、(a,b+1)和(a+1,b+1)的灰度值来确定。
a和b的值分别为:
(x,y)点的灰度值f(x,y)应为:
;
其中
5、简单的空间变换
(1)图像缩放
MATLAB使用imresize函数来改变一幅图像的大小,调用格式如下:
B=imresize(A,M,METHOD),其中:
A-原图像;
M-缩放系数;
B-缩放后的图像;
METHOD-插值方法,可取值'nearest','bilinear'和'bicubic'。
【例】原图像放大1.25倍
[I,map]=imread('kids.tif');
J=imresize(I,1.25);
subplot(1,2,1),subimage(I,map)
subplot(1,2,2),subimage(J,map)
调用imresize函数时可以指定输出图像的真实大小。
例如,以下命令将创建一幅100×150的输出图像:
Y=imresize(X,[100150])
注意,如果指定的大小不能够产生与输入图像同样的外观比例,那么输出的图像将会产生失真。
(2)图像旋转
使用imrotate函数来旋转一幅图像。
调用格式如下:
B=imrotate(A,ANGLE,METHOD,BBOX),其中:
A-需要旋转的图像;
ANGLE-表示旋转的角度,正值为逆时针;
METHOD-插值方法;
BBOX-取值loose(缺省)、crop
【例】图像旋转
CLF
[I,map]=imread('kids.tif');
J=imrotate(I,35,'bilinear');
J1=imrotate(I,35,'bilinear','crop');
subplot(2,2,1),imshow(I,map)
subplot(2,2,3),imshow(J,map)
subplot(2,2,4),imshow(J1,map)
(3)图像剪切
使用imcrop函数可以从一幅图像中抽取一个矩形的部分。
imcrop函数的调用格式如下:
X2=imcrop(X,MAP,RECT)
其中,X表示有待剪切的图像,不指定X时,imcrop将当前坐标轴中的图像作为待剪切的图像。
MAP表示X为索引图像时的调色板,RECT定义剪切区的矩形坐标。
如果调用imcrop时不指定矩形的坐标,那么当光标位于图像中时会变成十字形,可以通过拖曳鼠标的方式交互式地选择一个矩形。
imcrop函数根据用户的选择绘制一个矩形,释放鼠标键后将产生一个新的图像。
例如,首先显示一幅如下左图所示的图像,然后调用imcrop。
imcrop函数会等待用户选择图像中的剪切区域,然后函数imshow将显示剪切得到的图像。
imshow('kids.tif');
I=imcrop;
figure,imshow(I);
【例】
五、仿射变换
仿射变换,可以用以下函数来描述:
,其中,A是变形矩阵,b是平移矩阵。
(1)尺度变换
变换矩阵:
S≥0
【例】
CLF;I=checkerboard(20,2);
subplot(121);imshow(I);axison;title('原图')
s=1.5;T=[s0;0s;00];
tf=maketform('affine',T);
I1=imtransform(I,tf,'bicubic','FillValues',0.3);
subplot(122);imshow(I1);axison;title('尺度变换')
(2)伸缩变换
变换矩阵:
【例】
CLF;I=checkerboard(20,2);
subplot(121);imshow(I);axison;title('原图')
t=2;T=[10;0t;00];
tf=maketform('affine',T);
I1=imtransform(I,tf,'bicubic','FillValues',0.3);
subplot(122);imshow(I1);axison;title('伸缩变换')
(3)扭曲变换
变换矩阵:
【例】
CLF;I=checkerboard(20,2);
subplot(121);imshow(I);axison;title('原图')
u=0.5;T=[1u;01;00];
tf=maketform('affine',T);
I1=imtransform(I,tf,'bicubic','FillValues',0.3);
subplot(122);imshow(I1);axison;title('扭曲变换')
(4)旋转变换
变换矩阵:
【例】
CLF;I=checkerboard(20,2);
subplot(1,2,1);imshow(I);title('原图')
angle=20*pi/180;
sc=cos(angle);ss=sin(angle);
T=[sc-ss;sssc;00];
tf=maketform('affine',T);
I1=imtransform(I,tf,'bicubic','FillValues',0.3);
subplot(122);imshow(I1);title('旋转变换')
(5)综合变换
变换矩阵:
,
【例】
CLF;I=checkerboard(20,2);
subplot(1,2,1);imshow(I);title('原图')
s=2;As=[s0;0s];%尺度
t=2;At=[10;0t];%伸缩
u=1.5;Au=[1u;01];%扭曲
st=30*pi/180;sc=cos(angle);ss=sin(angle);
Ast=[sc-ss;sssc];%旋转
T=[As*At*Au*Ast;35];
tf=maketform('affine',T);
I1=imtransform(I,tf,'bicubic','FillValues',0.3);
subplot(122);imshow(I1);title('综合')
(6)控制点变换
【例】
I=imread('cameraman.tif');
udata=[01];vdata=[01];
tform=maketform('projective',...
[00;10;11;01],[-42;-8-3;-3-5;62]);
[B,xdata,ydata]=imtransform(I,tform,...
'bicubic','udata',udata,'vdata',vdata,'size',size(I),'fill',128);
subplot(1,2,1);imshow(udata,vdata,I),axison
subplot(1,2,2);imshow(xdata,ydata,B),axison