在实际的对图像处理过程中,由于我们读出的图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此读出的图像数据不能直接进行相加求平均,因此必须使用一个函数将图像数据转换成双精度型数据。MATLAB中提供了这样的函数:
im2double函数,其语法格式为:
I2 = im2double(I1) 其中I1是输入的图像数据,它可能是unit8或unit16型数据,通过函数的变化输出I2为一个double型数据,这样两图像数据就可以方便的进行相加等代数运算.
要把double的图像(范围是0到1)再次转化为256灰度值的,可以这样
Igrey=
uint8(I2*255)
图像类型转换函数:
dither() 通过颜色抖动,把真彩图像转换成索引图像或灰度图象转换成二值图像
gray2ind() 将灰度图像(或二值图像)转换成索引图像
grayslice() 通过设定的阈值将灰度图象转换成索引图像
im2bw() 通过设定亮度阈值将灰度、真彩、索引图象转换成二值图像
ind2gray() 将索引图象转换成灰度图象
ind2rgb() 将索引图象转换成真彩色图像
mat2gray() 将一个数据矩阵转换成一幅灰度图象
rgb2gray() 将真彩转换成灰度图象
rgb2ind() 将真彩转换成索引图象
图像类型与类型间的转换
1。索引图像:包括一个数据矩阵X和一个色图阵MAP。矩阵元素值指向MAP中的特定颜色向量。
2。灰度图像:数据矩阵I,I中的数据代表了颜色灰度值。矩阵中的元素可以是double类型、8位或16位无符号的整数类型。
3。RGB图像:即真彩图像。矩阵中每个元素为一个数组,数组的元素定义了像素的红、绿、蓝颜色值。RGB数组可以是double类型、8位或16位无符号的整数类型。
4。二值图像:一个数据阵列,每个象素只能取0或1。
矩阵的基本运算
行列式求值:det(A)
矩阵加减:+、-
矩阵相乘:*
矩阵左除:A/B %相当于inv(A)*B
矩阵右除:AB %相当于A*inv(B)
矩阵的幂:^
矩阵转置:'
矩阵求共轭(实部相同,虚部相反):conj(X)
矩阵求逆:inv(X)
级数的求和与收敛
symsum(fun,var,a,b):其中fun是通项表达式,var为求和变量,a为求和起点,b为求和终点
例如:I为1/[n*(2n+1)]从1到正无穷的和,求I
syms n;
f1=1/(n*(2*n+1));
I=symsum(f1,n,1,inf)
计算结果为:
I =2-2*log(2)
空间曲面
mesh()函数语法:
mesh(Z):
mesh(X,Y,Z,C):其中C是用来定义相应点颜色等属性的数组
例:求x^2+y^2=z的空间曲面
x=-4:4;
y=x;
[X,Y]=meshgrid(x,y);%生成x,y坐标
Z=X.^2+Y.^2;
mesh(X,Y,Z)
曲面图
[x,y]=meshgrid(xa,ya)
当xa,ya分别为m维和n维行向量,得到x和y均为n行m列矩阵。meshgrid常用于生成x-y平面上的网格数据;
mesh(x,y,z)绘制网面图,是最基本的曲面图形命令,其中x、y、z是同阶矩阵,表示曲面三维数据;
mesh(xa,ya,z)
xa,ya分别为m维和n维向量,z为n行m列矩阵。等价于先[x,y]=meshgrid(xa,ya)再mesh(x,y,z);
surf(x,y,z)绘制曲面图,与mesh用法类似;
contour(x,y,z)绘制等高线图,与mesh用法类似,可指定z的范围;
contour3(x,y,z)绘制三维等高线图,与mesh用法类似,可指定z的范围。
空间曲线
例:求方程组的空间曲线
1。化为参数方程组
x=t
y=sqrt[t(1-t)]
z=sqrt[1-x^2-y^2]
2。 程序
t=0:0.001:1;
x=t;
y=sqrt(t.*(1-t));
z=sqrt(1-x.^2-y.^2);
plot3(x,y,z,z,-y,z)
其中.*为数组相乘,.^为数组乘方
matlab实现离散余弦变换压缩(JPEG压缩原理)
JPEG图像压缩算法:
输入图像被分成8*8或16*16的小块,然后对每一小块进行二维DCT(离散余弦变换)变换,变换后的系数量化、编码并传输;
JPEG文件解码量化了的DCT系数,对每一块计算二维逆DCT变换,最后把结果块拼接成一个完整的图像。在DCT变换后舍弃那些不严重影响图像重构的接近0的系数。
DCT变换的特点是变换后图像大部分能量集中在左上角,因为左上放映原图像低频部分数据,右下反映原图像高频部分数据。而图像的能量通常集中在低频部分。
实例程序:
Jpeg
I=imread('D:MATLAB7toolboximagesimdemoscameraman.tif');
%该图片在安装matlab的目录中找,原图为灰度图象
I=im2double(I);%图像存储类型转换
T=dctmtx(8);%离散余弦变换矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T');
%对原图像进行DCT变换
mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask);
%数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);
%进行DCT反变换,得到压缩后的图像
imshow(I)
title('原始图像')
figure;
imshow(I2)
title('压缩后的图像')
应用到的函数:
I=imread('图像文件名') :读取图像数据,保存在矩阵I中;
imshow(I) :显示灰度图像I,其他用法见matlab帮助;
I2=im2double(I1) :把图像数组I1转换成double精度类型;
D=dctmtx(n) :二维离散余弦变换函数,返回n*n离散余弦变换矩阵。
一个n*n的变换矩阵T被定义成:
Tpq=1/sqrt(n) ,当p=0,0<=q<=M-1;
Tpq=sqrt(2/n)*cos[pi*(2q+1)*p/2n] ,当1<=p<=M-1,0<=q<=M-1。
B=blkproc(A,[m n],fun,P1,P2...)
:块操作函数。对图像A的每个不同的m*n块应用fun函数,P1,P2等为fun函数参数。在图像边缘用0来扩展;只有当fun的返回矩阵是m*n矩阵时,B和A的大小才相同。
figure:强制生成一个新的个绘图窗口;
非线性方程求解
fsolve(fun,x0,options)
其中fun为待解方程或方程组的文件名;
x0位求解方程的初始向量或矩阵;
option为设置命令参数
建立文件fun.m:
y=fun(x)
y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...
x(2) -
0.5*cos(x(1))+0.3*sin(x(2))];
>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve'))
注:
...为续行符
m文件必须以为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。
不定积分与定积分
不定积分:int(fun,var)
例:求∫sinaxsinbxsincxdx
syms a b c x
y=sin(a*x)*sin(b*x)*sin(c*x);
int(y,x);
pretty(ans)
定积分:int(fun,var,a,b)
其中a,b分别为上下限
求解线形方程
solve,linsolve
例:A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];
%矩阵的行之间用分号隔开,元素之间用逗号或空格
B=[3;1;1;0]
X=zeros(4,1);%建立一个4元列向量
X=linsolve(A,B)
diff(fun,var,n):对表达式fun中的变量var求n阶导数。
例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式
diff(F); %matlab区分大小写
pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式
求极限
limit:
例:limit(F,x,a,left);对表达式F求极限,变量为x,从左边趋近a。
inf:正无穷;-inf:负无穷。
matlab之基本绘图函数
figure:强制生成一个新的个绘图窗口;
syms x y t :声明变量;
fplot(函数表达式,绘图区间);
plot(横坐标向量,纵坐标向量,颜色/线形等参数)
ezplot(函数表达式):简单的fplot,easy fplot
axis([xmin xmax ymin ymax ...]):设置坐标轴显示范围
傅里叶基本知识:在图象处理的广泛应用领域中,傅立叶变换起着非常重要的作用,具体表现在包括图象分析、图象增强及图象压缩等方面。
假设f(x,y)是一个离散空间中的二维函数,则该函数的二维傅立叶变换的定义如下:
u=0,1…M-1 v=0,1…N-1 (1)
离散傅立叶反变换的定义如下:
x=0,1…M-1 y=0,1…N-1(3)
F(p,q)称为f(m,n)的离散傅立叶变换系数。这个式子表明,函数f(m,n)可以用无数个不同频率
的复指数信号和表示,而在频率(w1,w2)处的复指数信号的幅度和相位是F(w1,w2)。
例如,函数f(m,n)在一个矩形区域内函数值为1,而在其他区域为0.
假设f(m,n)为一个连续函数,则f(m,n)的傅立叶变换的幅度值(即)显示为网格图。
将傅立叶变换的结果进行可视化的另一种方法是用图象的方式显示变换结果的对数幅值。
MATLAB提供的快速傅立叶变换函数
(1)fft2
fft2函数用于计算二维快速傅立叶变换,其语法格式为:
B = fft2(I)
B = fft2(I)返回图象I的二维fft变换矩阵,输入图象I和输出图象B大小相同。
例如,计算图象的二维傅立叶变换,并显示其幅值的结果,其命令格式如下
load imdemos saturn2
imshow(saturn2)
B = fftshift(fft2(saturn2));
imshow(log(abs(B)),[],'notruesize')
(2)fftshift
MATLAB提供的fftshift函数用于将变换后的图象频谱中心从矩阵的原点移到矩阵的中心,其语法格式为:
B = fftshift(I)
对于矩阵I,B = fftshift(I)将I的一、三象限和二、四象限进行互换。
(2)ifft2
ifft2函数用于计算图象的二维傅立叶反变换,其语法格式为:
B = ifft2(I)
B = ifft2(A)返回图象I的二维傅立叶反变换矩阵,输入图象I和输出图象B大小相同。其语法格式含义与
fft2函数的语法格式相同,可以参考fft2函数的说明。
简单低通滤波器的设计 一个图象经过傅立叶变换后,就从空域变到了频域,因此我们可以用信号处理中对于频域信号的处理
方法对一幅图象进行处理。比如对图象进行低通滤波等。
虽然在计算机中必定能够模拟一个锐截止频率的理想低通滤波器,但它们不能用电子元件来实现。实
际中比较常用的低通滤波器有:巴特沃思(Butterworth)滤波器、指数滤波器(ELPF)、梯形低通滤波
器等。
在实验中我们设计一个理想的低通滤波器。
设计理想的低通滤波器由其定义可知只要设计一个与频域图象大小完全相同的矩阵。在某一个域值内
该矩阵的值为1,其余为0即可。
例:若图象的大小为128*128,则可以这样设计一个低通滤波器:
H=zeros(128);
H(32:96,32:96)=1; %此处的范围是人为取定的,可以根据需要更改。
若图象矩阵I的傅立叶变换是B(已经用fftshift将频谱中心移至矩阵的中心),则对这幅图象做低通滤
波,再做傅立叶逆变换命令为
LOWPASS=B.*H; %此处设变换后的矩阵为LOWPASS,另注意这儿是矩阵的点乘。
C=ifft2(LOWPASS);
Imshow(abs(C))
引言 图像镶嵌技术(mosai
)是图像融合技术的一种,一般指的是同种类型图像的融合。他把多幅具有重叠信息部分的图像衔接在一起,得到一幅完整的、范围更大的图像,并且去除其中的冗余信息。图像镶嵌技术的应用非常广泛。例如,虚拟现实中的全景图显示及遥感图像的处理等领域,都有广泛的应用。图像镶嵌的评价标准是镶嵌后得到的图像,不但具有良好的视觉效果,而且还要尽可能地保持图像光谱特征。通俗地说,就是镶嵌的图像越“无缝”,效果就越好。当然,这里的“无缝”,不是绝对意义上的,而是人眼分辨力以内的“无缝”。
一般情况下,进行图像拼接时,在拼接的边界上,不可避免地会产生拼接缝。这是因为两幅待拼接图像在灰度上的细微差别都会导致明显的拼接缝。而在实际的成像过程中,这种细微差别很难避免。因此图像镶嵌技术的难点就在于准确寻找图像之间的位置关系,并把两幅以上的图像平滑地衔接在一起,获取一幅全局的图像。本文的基本思想就是突破以往在寻找拼接线时,只要找到一个最佳拼接点,以此点做一条直线作为拼接线的不合理性,而是取一个闭值,在闭值范围内寻找出每个拼接点,把这些点连成的折线作为拼接线,进行拼接。
2 拼接缝消除的方法
传统的拼接缝消除的方法有很多,其中用得较多的方法有;中值滤波法、利用小波变换的方法、加权平均法等
2 .
1 中值滤波法消除拼接缝
中值滤波法是对接缝附近的区域进行中值滤波。对与周围灰度值差比较大的象素取与周围象素接近的值,从而消除光强的不连续性。中值滤波器处理接缝附近的狭长地带。该方法速度快,但质量一般。平滑的结果会使图像的分辨率下降,使图像细节分辨不出,产生图像模糊。
2 .
2 利用小波变换的方法消除拼接缝
小波变换方法也是目前比较常用的一种方法,他充分利用小波变换的多分辨率特性,很好地解决了拼接图像的接缝问题。其原理为:由于小波变换具有带通滤波器的性质,在不同尺度下的小波变换分量,实际上占有一定的频宽,尺度j
越大,该分量的频率越高,因此每一个小波分量所具有的频宽不大,把要拼接的两幅图像先按小波分解的方法将他们分解成不同频率的小波分量,只要分解得足够细,小波分量的频宽就能足够小。然后在不同尺度下,选取不同的拼接宽度,把2
个图像按不同尺度下的小波分量先拼接下来,然后再用恢复程序,恢复到整个图像。这样得到的图像可以很好地兼顾清晰度和光滑度2
个方面的要求。但是,小波变换也存在缺点,如小波变换的算法比较复杂,需要在小波变换域内先进行拼接处理,在计算过程中涉及到大量的浮点运算和边界处理问题,对实际生产中的大容量图像进行处理时计算机内存开销很大,且处理时间较长,拼接速度慢。
2 .
3 利用加权平滑的方法消除拼接缝
在实际中,使用较多的方法还有对重叠区域进行加权平滑的方法。这种方法的思路是:图像重叠区域中象素点的灰度值Pixel
由两幅图像中对应点的灰度值LPixel 和RPixel 加权平均得到,即:
P ixel 一k X LPixel + ( l 一k ) X RPixel 其中:k 是渐变因子,满足条件:o
< k < 1 ,在重叠区域中,按照从左图像到右图像的方向,k 由1
渐变至0 ,由此实现了在重叠区域中由左边重叠区慢慢过渡到右边重叠区的平滑拼接。
寻找最佳拼接线时,采用一个滑动窗口在图像重叠区上逐行选择灰度值差异最小的象元作为最佳拼接点。但是,如果按照这种拼接点选择法,会出现一个新问题,就是往往会出现上下行拼接点位置相差较远的现象,这样拼接后有时因上下行之间灰度差异较大而造成新的接缝。为避免这类现象发生,不仅要考虑相邻拼接点的灰度值差异,而且还要考虑相邻拼接点的位置不能太远。这样就引进了一个阑值T
,把选择最佳拼接点的范围限制在这个阑值内。除第一行按灰度值差异最小的原则处理外,其他各行的拼接点从一个选定区域中选取:即与上一行所选拼接点同列的点及以该点为中心左右宽度为T
的区域中的点。在这个区域中选取一个最佳拼接点。选出每行的拼接点后连接成一条拼接线,可想而知,这条拼接线可能是条折线。这样,由于各行都是选择规定邻域内灰度差异最小的点作为拼接点,接缝现象就会得到很大的改观。同时,T
的值又不能选取得太大,应在1 一5
之间选取为佳。找出最佳拼接缝后,按前面所述的加权平滑对重叠区域再进行过渡,得到的图像质量有很大改观。