给一个算法如何写程序https://blog.csdn.net/baidu_38205880/article/details/80241655先在网上找一些参考再写
算法的一般步骤自顶向下,考虑输入输出,有点像信号中的响应的思想,还要考虑数据结构,特殊输入,增加程序的健壮性,
下面是数字图像处理matlb方面的知识,看例子是很快理解知识点的一种方案,具体都要实现什么功能,可以做分解,然后每一步都用流程图实现,最后编写代码
本文参照的图书MATLAB图像处理实例详解,链接地址:https://pan.baidu.com/s/1uUBqJNdWpzTZ21xLZnFMRg
提取码:3hpc,本文是做图像处理很好辅助博文,具体使用方法是先用ctrl+F来搜索需要处理的函数名称,找到之后再MATLAB中输入函数按F1键获得函数帮助,就可以使用函数了。
目录
前言
使用说明
一,MATLAB基础
1.1矩阵的算术运算
1.2判断循环
1.3MATLAB绘图
1.3.1二维图形绘制
二,MATLAB图像处理基础
2.1图像类型的转换
2.2文件信息的读取保存
三,数字图像的点运算
3.1图像点运算
3.2图像的领域操作
四,图像增强
4.1空域滤波
4.2频域滤波
五,图像复原技术
5.1空域滤波复原
5.2图像复原
六,图像分割
六,图像变换技术
七,彩色图像坐标变换
八,图像压缩编码
九,图像特征分析
十,图像形状特征
10.1形状特征描述
10.2形态学数字图像处理
十一,小波变换
十二,Simulink数字图像处理
按下Tab命令可以出现提示,
二进制图像函数,im2bw();单精度表示式single,双精度是double,查看变量的字节空间大小whos命令,注意普通数组[],细胞数组{},函数句柄是一个可调用的MATLAB函数的关联,通过句柄可以调用任意函数用@fhandle创建句柄>> fhandle=@sin,>> y1=fhandle(2*pi),y3=sin(2*pi);利用struct()函数创建结构体
>> student=struct('name',{'liming','nnn'},'number',{'2012','200'}),也可以stu(2).name='mm';
stu(2).number='11'来建立结构体
细胞数字作为MATLAB特有的一种数据类型,组成它的元素是细胞,细胞用来存储不同类型数据单元,细胞数组的建立可以用直接赋值法和cell()函数,语句后面有冒号就是先不执行,没有冒号就是直接执行cellplot(student)显示细胞数组的结构,
对角矩阵eye(3),魔方矩阵magic(3),点乘.*,乘*,矩阵比较大小本质上也是一个一个的比返回的结构也是矩阵,就是对应元素是0,表示假,1表示真
>> A=[1 2 3;2 5 6];
>> B=[2 2 3;27 8 8];
>> cl=A
cl =
2×3 logical 数组
1 0 0
1 1 1
逻辑运算异或xor(A,B)需要维数相同,运算符的优先级,括号运算最高,非运算的优先级也比较高,点乘高于乘,逻辑的其它运算优先级最低
矩阵:创建一个行矩阵可以有逗号或者空格来分隔每一个元素,行与行之间是用“;”,行列之间是用逗号,创建多行矩阵,行与行之间用分号来分隔,常用的特殊矩阵函数比如ones(n),n是维度,见书的49页
>> a=[1 2 3];
>> b=[1,2,3]
矩阵的操作[A B]表示矩阵横向合并,[A;B]表示纵向合并,用([x],[y]);来表示提取矩阵([1 3],[2 3]),冒号在提取这部分的作用
[1:3]表示1到3,[:]表示省略,不提取,det()求矩阵行列式的值,transpose()求转置矩阵,求逆矩阵inv(),满秩的方阵才有逆矩阵,在MATLAB中非满秩的方阵也可以求逆矩阵,叫伪逆矩阵pinv(),求矩阵的秩可以用rank()函数,秩就是矩阵中非零元素阶次的最大值,ans是默认的一个变量;
MATLAB控制语句for,while,if,for 变量=初始:增量:终值,增量省略是默认是1,比如for a=1:6,每一层for循环都以for开始end结束,给矩阵赋值要现有矩阵,比如可以用特殊的值创建矩阵,之后在改变,和我们之前c的不同if在于没有括号,需要加end结束循环,while(循环条件) end
>> clear
>> for a=1:5
x=a+a;
end
>>
选择结构if,swich,try,选择结构的作用是根据指点的条件是否可以满足,决定程序的流向,向if,try,for这样的关键字后都不用加";"
if 表达式
语句1;
else
语句二;
end
swich 表达式
case 表达式1
语句1
case 表达式2
语句2
otherwise
语句3
end
try是一个错误捕捉语句,程序先执行语句一没有错误就跳出try,有错误就执行语句二,
try
语句1
catch
语句2
end
A=imread('D:\logi\IMG20160402201058','jpg');
catch
A=imread('D:\logi\IMG20160402201059','jpg');
end
>> imshow(A)
影响程序流程走向的程序,称为流程控制语句,break,continue,return,break是终止的是循环体,而continue结束的是一次循环,break可以跳出本次循环,执行语句end的下一条语句,continue语句可以结束本次循环,跳过其后的循环,执行下一次循环,pause语句:其调用格式为pause,则暂停程序运行,按任意键继续,还有一种调用格式为pause(n),就是程序暂停n秒后执行,调用格式为pause on /off,就是允许或禁止之后的程序执行,
M文件就是 编写函数的,编写好之后可以在命令窗口调用函数,M文件就是一系列命令的集合,M文件分为脚本文件和函数文件脚本文件不接受参数输入,也不返回输出参数,文件执行过程中产生的所有变量都存储在工作空间中,函数文件可以接受参数输入,也有返回值,程序执行完局部变量就会释放不会存储在工作空间中,从新建的地方建立脚本或函数文件,只有输入参数和输出参数会存储在工作空间,而脚本文件只要m文件中变量在工作空间中都可以查到。
M文件的调试,在有疑问的地方添加变量输出就,查看是否有错,还可以查询工作空间中的变量,可以利用工具的Debug,在matlab中用%号来表示注释,脚本文件的每一行结尾都要有“;”,
function y%输出参数%=average%函数名%(x%输入参数%)
y=sum(x)/length(x);
end
MATLAB绘图步骤:
1)数据准备 确定变量的函数关系及取值范围,明确横坐标变量和纵坐标变量,计算出变量数据,
2)设置图形窗口位置在指定的位置创建新的绘图窗口,缺省是打开figureN01
3)绘制图形,生产图形文件:创建坐标轴,调用绘图函数,设置图形中线型,色彩,数据点形等属性
4)图形的修饰:为了突出图形显示结果,可对生成的图形文件做进一步调整如设置坐标轴的范围和刻度,图形注释(图名,坐标名文字说明等
5)保存和导出图形,按指定文件格式保存图形导出图形,以方便后续使用
使用函数plot(),用subplot()来分割函数,图形的修饰可以在plot()函数中加参数,具体可以参考68页,plot(x,y,‘b’),t图形的坐标轴限制函数anxis([xmin xmax ymin ymax]),对横轴坐标的标注xlable('string'),标题使用title(‘string’)利用gtext('sting')来用鼠标给函数曲线命名,也就是说用gtext('string'),产生文字用鼠标拖拽在曲线上,用grid函数给图像加栅格
>> clear
>> x=0:0.02:2*pi;
>> y=sin(x);
>> plot(x,y);
>> plot(x,y,'b')
>> plot(x,y,'g')
>> gtext('sinx')
>> grid
1.3.2直方图绘制
使用函数hist(y,n)将Y的值等分为n段,平均的分在x轴上,然后统计每一段出现的频率,柱状图用bar(x,y)来画,
matlab中有几种获取帮助的途径
第一种,也是最有效的就是选中函数名,按F1直接查看该函数的帮助文档;
•第二种,就是通过命令窗口中(help 函数名)来获取该函数的帮助文档;
•第三种,就是通过工具栏中的帮助菜单来输入函数名,获取该函数的帮助文档;
•第四种,就是去matlab官网MathWorks查找函数的帮助文档
取值是通过函数来实现,具体可以看28页,在matlab中A既可以是变量,也可以是矩阵,一般习惯用小写表示变量,大写表示矩阵,
1)主要介绍matlab图像处理工具箱可以从help--图形处理工具箱,还可以从左下角start打开;
图像类型的转换,可以用对应的函数来完成,图像的转换如下图3.11所示RGB转为灰度函数RGB2gray(),其他函数可以参照P80页灰度图像转为索引图像,灰度图像是一个二维数组矩阵,而索引图像不仅包括一个二维的数组矩阵,还包括一个Mx3的颜色映射表,所以要将灰度图像转换为索引图像,则必须生产对应的颜色映射表,调用函数格式为[x,map]=gray2ind(I,n)就是将灰度图像I转为索引图像,n是灰度级数默认64,[x,map]对应转换后的索引图像,map中对应的颜色值为颜色图gray(n)中的颜色值,索引图像中有颜色,饱和度,亮度信息,灰度图像只保留了亮度信息,将索引图像转为RGB图像,[x,map]指向索引图像,将RGB指向转换过程中形成一份三维数组,然后将索引图像的颜色映射表中的颜色值赋值给三维数组,,二值图像的转换,如果图像转换前不是灰度图像,要先转为灰度图像,然后再通过阈值法把灰度图像转化为二值图像;一个数据矩阵就相当于一幅数字图像,只是在数字图像中对应的数组元素必须在一定的取值范围内可以调用mat2gray()进行转化,格式为I=mat2gray(X,[xmin,xmax]),xmin对应灰度值0,即黑色,xmax对应灰度值为1,即白色,具体可看P84,索引图像和RGB图像的构成比较类似,索引图像是一个数组和一个映射表先找到数组中的值,数组中的值对应一个map值,map值中有颜色信息,而RGB是三个分量的颜色合成色彩信息
>> map=colorcube(128);%指定颜色的数目
>> x=rgb2ind(RGB,map);
>> imshow(x,map)%显示索引图像的
文件信息的读取,用imfinfo()来读取文件信息,调用格式为INFO=imfinfo('filename','fmt'),或INFO=imfinfo('filename.fmt')filename是文件名,fmt是文件类型名;图像文件的读取用imread(),彩色图像和灰度图像调用格式为I=imread('filename','fmt')或I=imread('filename.fmt'),索引图像[X,map]=imread('filename','fmt'),还有网络图片的读取,具体参照p93;特殊文件格式的读写,比如GIF[...]=imread(...,'frames',idx),idx是图像的编号,
>> [I,map]=imread('D:\logi\GIF1.gif',2);
>> imshow(I,map)
图像文件的保存,用函数imwrite(),大体使用方法和imread()类似,调用格式为imwrite(I,'filename','fmt'),索引图像的保存为imwrite(X,map,filename','fmt')
图像文件的显示imtool()工具箱图像浏览器或imshow()通用的常用的;像素信息的显示函数impixel()可以返回选中像素或像素集数据,可以直接将像素坐标作为该函数的输入参数;函数impixelinfo(),>> pixels1=impixel(I)用鼠标选定图像上的点然后显示该点的值,选完之后按Enter结束,impixel()还可以用来显示特定的像素值不用鼠标impixel(I,100,400),100,400分别为横纵坐标;函数impixelinfo()就是用这个函数写完之后显示了图像,你就可以在上面用鼠标点,点了之后就会执行在图像的上方或者下方直接显示该点的像素值
视频文件的读取,主要函数有aviinfo()和函数aviread()来读取视频文件信息及视频流,新出现的读取函数有mfileinfo(),mmreader()和函数read();视频文件的播放用函数movie(),movie(M),播放M一次,M是一个结构体包含cData和Colormap,movie(M,N)就是播放视频M,N次,movie(M,N,FPS),FPS是帧速率,默认是12帧/秒
图像点运算,点运算又称对比度增强,对比度拉伸或灰度变换,是对通过图像中一个像素值,进行运算的图像处理方式B(x,y)=f(A(x,y)),J = imadjust(I,[low_in; high_in],[low_out; high_out],gamma)
图像复原技术,可以通过imnoise()给图像添加噪声,调用格式为imnoise(I,type,parameters),parameters不同噪声的参数不同,如果是椒盐噪声则表示,椒盐噪声的密度大小,高斯噪声则表示均值和方差,空域滤波方法,首先是均值滤波包括算术均值滤波和几何均值滤波,顺序统计滤波包括中值滤波,中值滤波能够很好的保留图像的边缘,非常适合去除椒盐噪声,效果优于均值滤波,顺序统计滤波还包括最大值,最小值滤波,最大值滤波能够去除椒盐噪声,但是会从黑色物体的边缘去除一些黑色像素,最小值滤波类似,会从白色物体的边缘去除一些白色像素,J=medfilt2(I, [m, n]);二维中值滤波,采用的窗口大小是mxn的,B=ordfilt2(A,order,domain),domain=[0 1 1 0; 1 1 1 1; 1 1 1 1; 0 1 1 0];J=ordfilt2(I, 6, domain);domain是一个模板,order是去除domain中的第6个像素值作为该点像素值;自适应滤波wiener2()可以根据图像中的噪声进行滤波,还可以对噪声进行估计,该函数根据图像的局部方差来调整滤波器的输出,调用格式为J=wiener2(i,[m,n],noise),采用的窗口为mxn,如果不指定窗口大小,默认是3x3的,输入噪声noise为噪声的能量,返还的是图像J,K=imcrop(I, [100, 100, 1024, 1024])是裁剪图像的函数,意思就是从(100,100)的起始坐标开始,裁剪出1024x1024的图像,[K, noise]=wiener2(J, [5, 5]);采用维纳自适应滤波,返回图像K和图像的噪声估计。
图像复原:1,逆滤波复原,通过傅里叶变换实现,最后用傅里叶反变换,2,自适应滤波优点是复原效果好,计算量较低,PSF=fspecial('motion', LEN, THETA);该函数就是产生滤波模板的,比如产生拉普拉斯算子模板,K=deconvwnr(J, PSF, NSR);这是维纳自适应滤波函数,NSR是信噪比3,约束最小二乘法复原,采用函数deconcreg()进行图像的约束最小二乘法复原,调用格式是J=deconvreg(I,PSF),lucy复原,K=deconvlucy(J, PSF, 5);5是迭代次数,迭代次数越多,复原效果越好;前面的复原方法都需要预先知道退化图像的PSF,但在实际应用中,经常是不知道PSF的情况下对图像进行复原,下面介绍盲解卷积复原,对PSF进行估计,[K, PSF2]=deconvblind(J, INITPSF, 30); INITPSF为输入的PSF估计值,PSF2为真实的PSF的一个估计值,fspecial函数用于创建预定义的滤波算子,可以用来产生噪声模板,或者使用imnoise来直接添加噪声,会与imfilter搭配使用,g = imfilter(f, w, filtering_mode, boundary_options, size_options)其中,f为输入图像,w为滤波掩模,g为滤波后图像。filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:
图一 图二
从定义式中可以看到,互相关函数和卷积运算类似,也是两个序列滑动相乘,但是区别在于:互相关的两个序列都不翻转,直接滑动相乘,求和;卷积的其中一个序列需要先翻转,然后滑动相乘,求和,如果使用算子来模糊图像,需要算子和图像混合后,再使用滤波函数
图像分割主要包括边缘分割技术,阈值分割技术和区域分割技术,边缘分割和我们之前的边缘检测有些类似,常用的有微分算子sobel算子,Roberts算子等,对于图像中的间断点,常用的检测模板为如图二所示,线段的检测用的模板也如上图二所示其中第一个是用来检测0度的直线,第二个模板是用来检测45度的直线,Roberts算子J=edge(I, 'roberts');表示采用roberts算子进行边缘检测,[J, thresh]=edge(I, 'roberts', 35/255);35/255表示所使用的阈值,thresh表示返回的图像分割阈值,这个阈值表示的是图像归一化以后的阈值,其它的算子类似都是直接在后面改相应的名称,[J, thresh]=edge(I, 'prewitt', [], 'both');'both'表示水平和垂直都检测,采用edge()进行边缘提取得到的图像为二值图像,只有黑白两种颜色 []表示占位符,canny算子用来抑制虚假边缘,因为它不依赖边缘方向,canny算子的调用也是通过edge()函数来实现,调用格式和soble算子一致;LOG算子就是拉普拉斯算子,是一种不依赖边缘方向的二阶微分算子,先利用高斯函数进行平滑,然后再利用二阶导数过零点的性质,去检测边缘,拉普拉斯算子就是一个两个方向的二阶偏导数之和,都是采用edge函数;阈值分割技术通过图像的直方图来选取合适的阈值,利用if,else来实现,全局阈值通常都选取波谷的值imhist(i,n)n为指定灰度级显示直方图,[width, height]=size(I);得到图像的行和列,也可以使用im2bw(I)来进行分割,也就是灰度图像转为二值图像,OTSU阈值分割,它的基本原理就是选取一个最佳的阈值将图像分割为两部分,使两部分的方差最大,具有最大的分离性,最佳阈值获取函数是J=graythresh(I),下面也是可以使用if,else来实现或者通过BW
= im2bw(I
,level
),level就是阈值,迭代式阈值分割,获取图像中像素的最大,最小值min(I(:)),max(I(:));区域生长法是一种将具有相似性质的像素集合起来构成区域,区域增长法根据区域内像素的相似性质来聚集像素点的方法,区域内像素的相似度量可以包括平均灰度值,纹理,颜色等信息,从初始区域开始,将相邻的具有同样性质的像素或其它区域归并到目前的区域中,从而逐步增长区域,直至没有合并的为止;还有另外一种分水岭,J=watershed(I, 8);参数里面的8代表8连通,在灰度直方图中的山脊称为分水岭,I=im2double(I) %图像灰度值归一化到[0,1]之间
六,图像变换技术
图像变换技术时间域就是空间域:图像Radon变换,在matlab中采用函数radon()进行图像的Radon变换,函数调用格式为R=radon(I,theta);thera为角度,R为图像I在theta方向上的变换值,
[R, xp]=radon(I, [0, 45]);xp为对应的坐标值,表示在0度和45度方向进行radon变换,x=xp(row),这表示获取位置,angel=theta(column)这表示获取角度,radon变换可以用来检测直线,就是radon变换中的最大值就对应的图像中最明显的直线,用函数iradon()来计算radon的反变换k=iradon(R,thera),R为radon变换矩阵,thera为角度;傅里叶变换通过函数fft()进行一维离散傅里叶变换,通过函数ifft()进行一维离散傅里叶反变换,二维的采用的是fft2(),函数的调用格式为Y=fft(X),或者Y=fft2(x,m,n)采用快速傅里叶算法,计算矩阵大小为二维离散傅里叶变换,傅里叶变换的一个意义,在频谱上是亮暗不一的亮点,如果频谱中暗的点数更多,那么实际图像是比较柔和的,如果亮点比较多,说明图像比价尖锐,通过函数fft2()得到的频谱图,坐标原点位于图像的左上角,可以通过函数fftshift(X),把坐标原点移至图像的中央,坐标原点是低频,向外是高频,可以对图像在频域进行滤波和增强,real(L)是复数的实部,J=fftshift(fft2(I)); L1=ifft2(ifftshift(K1));正变换的时候是先变换再平移,而反变换的时候是先平移后变换;图像离散余弦变换,实际上是傅里叶变换的实数部分,离散余弦变换DCT,有一个重要性质就是大部分可视化的信息都集中在少数的变换系数上,因此离散余弦变换经常用于图像压缩,例如国际压缩标准JPEG格式就采用了离散余弦变换,在傅里叶变换的过程中,如果被展开的函数是实偶函数,那么其傅里叶变换中只包含余弦项,基于傅里叶变换的这一特点,人们提出了离散余弦变换,DCT变换先将图像函数变换成偶函数的形式,再对其进行二维离散傅里叶变换,DCT变换可以看做一种简化的傅里叶变换,采用dct()进行一维离散余弦变换,采用idct()进行一维离散余弦反变换,二维的使用dct2(A),还可以用B=dct2(A,[m,n])该函数计算图像矩阵A的二维离散余弦变换,返回值为B,通过对A补0或裁剪,使得B的大小为m行n列,P=dctmtx(M);这就是离散余弦变换矩阵,离散余弦变换,变换得到的是离散余弦变换系数,离散余弦变换的一个重要用途就是用于图像的数据压缩,介绍图像数据压缩之前,首先介绍图像的块操作函数blkproc(),调用格式如下B=blkproc(A,[m,n],fun),表示对矩阵A进行块操作,对块的操作函数为fun,返回值的大小A和B相同,colormap gray;表示图像显示的颜色,T'是T 的转置,B=blkproc(I,[8,8],'P1*x*P2',T,T');% x就是每一个分成的8*8大小的块,P1*x*P2相当于像素块的处理函数,p1=T p2=T’,也就是fun=p1*x*p2'=T*x*T'的功能是进行离散余弦变换,B2 = blkproc(B,[8 8],'P1.*x',mask); %舍弃每个块中的高频系数,达到图像压缩的目的,I2=blkproc(B2,[8,8],'P1*x*P2',T',T); %进行反余弦变换,得到压缩后的图象,正变换还是反变换关键是看T'是在前还是在后,在前反变换;hadamard变换没有直接的变换函数但是可以用hadamard(n),n是阶数产生hadamard变换矩阵,也可以对图像进行hadamard变换H1=hadamard(h1);H2=hadamard(h2);J=H1*I*H2;hough变换用于检测几何形状,[H, Theta, Rho]=hough(BW, 'RhoResolution', 0.5, 'ThetaResolution', 0.5);H为返回的hough变换矩阵,Theta为变换角度,rho为变换半径,'RhoResolution', 0.5'RhoResolution'为名字,0.5是值,此外hough还有houghpeaks(),还有houghline();lines = houghlines(BW,theta,rho,peaks)表示在hough变换的基础上检测出线,y(:,1)中逗bai号前是行,逗号后du是列,冒号表示从几到几。所以y(:,1)表示第一列的所有元素,radon变换的显示函数是imagesc(J);不是imshow(),如果要显示fft2()的图像,最好把图像进行一下类型转换double型转为uint8()型,使用了ifft2()如果要显示必须imshow(real(L2)),MATLAB图像处理工具箱实现离散余弦变换有两种方法:dct2和dctmtx(1)使用函数dct2,该函数用一个基于FFT的算法来提高当输入较大的方阵时的计算速度。(2)使用由dctmtx函数返回的DCT变换矩阵,这种方法较适合于较小的输入方阵(例如8×8或16×16),imshow(A,[ ])
inshow(A,[ ])相当于imshow(A,[min(A),max(A)])自动调整数据范围以方便显示
彩色图像坐标变换,一种是面向硬件设备的彩色模型RGB,另外一种是面向视觉感知的彩色图像模型例如HSV模型,HSV模型是通过色调、饱和度、亮度来描述彩色图像,RGB是由红、绿、蓝三原色混合而成,不同模型之间可以进行转化,RGB空间转换到HSV空间,调用函数A=rgb2hsv(M),矩阵M的列分别表示红色、绿色、蓝色的强度,A的列分别表示色调、饱和度、亮度,H=HSV(:,:,1);%提取H矩阵,reshape(A,[2,3])
将 A
重构为一个 2×3 矩阵,维度可以改变但是元素的个数是需要保持不变的,c = jet(
返回包含 m
)m
种颜色的颜色图,反过来也是一样的hsv2rgb(H),RGB空间到ycbcr空间,调用函数K=rgb2ycbcr(RGB),RGB必须是一个mxnx3的矩阵,当然也可以K=ycbcr2rgb(ycbcr)
图像压缩编码,编码效率用编码参数来衡量数字图像的熵,图像的平均码长,编码效率,每秒所需的传输比特数为bps=mxnxR/两帧时间间隔,霍夫曼编码是一种把概率大的信息符号以短字长编码,概率小的以长字编码,这种编码形式的平均码子长度最短,具体的方法另外一篇文章中有仔细的说明,sort()是排序函数,Y = floor(X)四舍五入函数,看函数都是从最核心的部分开始看代码,因为其它的变量,或者循环之类都是为,最核心代码服务的,[dict,avglen] = huffmandict(symbols,p);%产生霍夫曼编码词典,返回编码词典dict和平均码长avglen,编码词典就是说比如16编码为001,15编码为100,以后在数据中出现直接来字典里面找,huffmanenco(actualsig,dict); %利用dict对actuals来编码,其结果存放在compress中,matlab的数据类型比如uint8直接决定了数据的范围2^8,可以直接在屏幕上disp('hello'),打印输出,
图像特征分析:颜色矩通常直接在RGB空间来计算,颜色分布信息主要集中在低阶矩,一阶矩就是均值,反映了每个颜色分量的平均强度用函数mean2(R),二阶矩就是方差,即不均匀性std(std(R)); ,三阶矩是偏度,三阶矩用定义,可用这些信息来辨识物体;许多图像识别系统都采用颜色直方图作为图像的颜色特征,它所描述的是不同色彩在整幅图像中所占的比例,不关心图像颜色分布的统计特性,常用的颜色空间有RGB颜色空间和HSV空间,imhist(I(:,:,1))%显示红色分辨率下的直方图,灰度直方图的分布,如果都在左边说明该分量主要在较暗的地方出现,如果在最右边说明,该分量主要集中在亮处,h = hsv(:, :, 1);%为色调h赋值,这个模型中颜色的参数分别是:色调(H)大概可以理解为图像上有几种颜色,饱和度(S)图像的鲜艳程度,明度(V)图像是亮还是暗,这些特征可以用来做图像分割,比如分离花和叶子;纹理特征反映物品的质地,比如粗糙度、光滑度、颗粒度,随机性和规范性,卫星遥感地表图像的分析常采用纹理分析,这是因为地表的山脉、河流、森林、城市建筑等表现出不同的纹理,下面介绍几种纹理特征的提取方法比如灰度差分统计,自相关函数,灰度共生矩阵,还有就是基于频谱特征的分析系,常用的纹理特征有平均值、对比度、熵、能量,灰度直方图不能直接进行纹理分析,熵值越大图形纹理越粗糙,平均值反映图像的光滑度;自相关函数是用来描述图像的粗糙度,小数值的纹理测度表示细纹理,大数值的纹理测度表示粗纹理,通常采用自相关函数作为纹理测度,mesh()函数用来画三维图像,光滑的自相关函数变化较小,粗糙的自相关函数变化较快,灰度共生矩阵是有函数的glcms = graycomatrix(I,Name,Value,...),glcm = graycomatrix(I,'Offset',[0 2]); %图像I的灰度共生矩阵,2表示当前像素与邻居的距离为2,offset为[0 2]表示角度为0为水平方向,要快速的看懂matlab函数就是描述前后注意,还要看例子的参数说明,灰度共生矩阵不直观,常常需要二阶统计量,matlab用stats = graycoprops(glcm,{'contrast','homogeneity'}),'contrast表示对比度,homogeneity同质性,也就是说是对角线的紧密程度,里面的参数还可以是Correlation,Energy一个表示相关,一个表示能量stats是一个结构体,contrast是一个成员变量,具体参考p323;频谱分析法用来在傅里叶变换处获得空间不容易 获得的纹理特征如周期,功率谱等,实际应用中将频谱转换到极坐标简化为S(r,),确定r则S()是一维函数可以确定以原点为中心的圆上行为特征,给定可以得到从原点某方向上的放射行为,在数字图像处理中通常把周期的变为非周期处理,频谱分析方法还有加伯变换Gabor(gabor)和小波变换具体可以参照P328。
形状特征描述一般是在物体从图像中分割出来以后进行分析,主要包括图像的轮廓提取和区域划分:先对轮廓进行描述在对边界特征进行描述,链码表示方法就是定好起点后,用4方向或者8方向来描述图形,多变形近似,有三种方法1,基于最小周长的多边形法即把线段拉直,还有两种基于最小均方误差的方法,直接坐标转为极坐标[cita,r]=cart2pol(xp1,yp1);%直角坐标转换成极坐标,polar(cita,r);%画出极坐标下的轮廓图,边缘提取使用edge()函数,区域特征描述,1区域面积描述法,用stats = regionprops(L,properties)来统计区域内的像素点的个数,2四叉树描述法S = qtdecomp(I,threshold)该函数实现对四叉树的分解,I为灰度图像,threshold为阈值,S为分解后的图像,blocks = repmat(uint8(0),size(S));%矩阵扩充为S的大小3拓扑关系,就是孔数和欧拉数,使用函数eul = bweuler(I,n),eul为欧拉数,I为图像,I为二值图像如果不是需要使用im2bw(),n=4或8表示4连通和8连通,Image2=fliplr(I);%对图像做镜像变换---镜像变换 ,log()函数用于缩小图像,还有一种方法矩描述
形态学数字图像处理,数字形态学是建立在微分几何以及随机论基础上的,集合论是数学形态学的基础,腐蚀运算和膨胀运算是数学形态学的两个基本变换,参与运算就是两个对象,,图像A感兴趣的目标,图像B结构元素,结构元素通常是个圆盘,但是它可以是任何元素,结构元素是腐蚀和膨胀最基本的组成部分,在matlab中结构体元素生产函数strel()创建任意大小和形状的结构元素对象,膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程,通过膨胀可以填充图像中的小孔,A+B,腐蚀是消除 边界点,使边界向内部收缩过程,可以消除小且无意义的物体,集合被结构元素腐蚀,记为A-B,采用bw2=imdilate(I, se),I是图像se是结构元素,imerode()可以进行腐蚀操作,开运算即先采用结构元素做腐蚀运算,然后再做膨胀运算,使用相同的结构元素,计为(A-B)+B函数J=imopen(I, se)通过开运算去除了图像中比较小的点,闭运算(A+B)-B,通过函数J=imclose(I, se)有利于把区域连接为一块;高帽滤波是A-开运算,高帽滤波可以增强图像的对比度,调用形式J=imtophat(I, se);,图像的低帽滤波A-闭运算,低帽滤波可以增强图像的边缘,调用形式K=imbothat(I, se);imadd(I, J)图像相加,imsubtract(I,J)两个图像相减;图像的填充通过函数imfill(),J=imfill(I, 'holes')通过holes填充图像中的空洞,返回局部极大值,局部极大值不是最大值,调用如下bw=imregionalmax(I),此函数返回的最大值对应1,其它是0,同样的局部最小值bw=imregionalmin(I);图像边界的测定,通过膨胀腐蚀获取图像边界,膨胀的结果减去腐蚀的结果就是图像的边界,还可以通过函数bwperim(I,n)获取二值图像的边缘,n在二维图像中是4或者8连通,二值图像的形态学操作,可以通过bwmorph()进行二值图像的大量形态学操作,例如图像的骨架化,图像的细化,以及开操作和闭操作,函数功能比较强大,J=bwmorph(I, 'thin');BW2 = bwmorph(BW,operation,n)对二值图像进行n次指定的形态学处理n=Inf表示无穷大,移除图像的内部点保留边界也是用的此函数,不过调用的参数为remove,腐蚀膨胀是最基本的形态学操作,下面还有一些二值图像的其他形态学操作,包括极限腐蚀,查表操作,图像的标记,对象的选择,图像的面积和欧拉数等,采用函数bwulterode()进行极限腐蚀,每个对象最后变为一个像素点为止;查表操作,用函数makelut()用于建立表单,函数applylut()用于查表操作,函数调用格式为lut=makelut(fun,n),其中fun为判断条件的函数,n为领域大小可以去2或者3,查表调用格式为applylut(BW,LUT)该函数采用查表的方式来对二值图像的领域进行操作,LUT为建立的表单,二值图像的标记,对于不同的连通区域分配不同的编号,采用函数bwlabel()只支持二维的二值图像和bwlabeln()支持任意维度的二值图像,函数L=bwlabel(bw,n)n为连通类型为4或者8连通,L标记矩阵和原来的二值图像具有相同的大小,还可以是[L, num]=bwlabel(BW, 8),num为连通区域的数目,二值图像的对象选择使用J=bwselect(I, c, r, 4);c为横坐标数组,r为坐标数组,4是4连通的意思,函数的意思就是从I中把这几个坐标的像素值取出来;二值图像的面积,面积是二值图像中像素值为1的像素个数,采用函数bwarea()计算二值图像的面积,total=bwarea(BW);
小波变换家族Waveletfamilies,或者是Waveletfamilies(‘n’),waveinfo('fk')看具体的信息,小波是一种快速衰减的波,震荡有零值,不像正弦波,缩放,拉伸和缩放,移动,就是让小波从左到右在信号上走,信号在时间刻度进行缩放,小波有一个带通的性质,相同频率的比率因子变化导致拉伸小波,对应较低的频率,较小的比率导致压缩小波,高频拉伸小波有助于捕捉缓慢的变化,缩小小波有助于捕获突然的变化,转移小波变换,离散小波的运用是去燥和压缩,连续小波变换的输出是系数,傅里叶变换是一个全时域的变换,全时域也就是说是负无穷到正无穷,为了解决傅里叶变换无限大的问题,我们提出了时窗,即Gabor变换也叫短时傅里叶变化,但是缺点是分辨率单一,因为在时域的窗口小,频率的就会宽,一旦宽了之后分辨率就会降低,一旦时域确定频域就会确定,不太自由,之后就提出了小波变换wavelet transtorm (WT),一元积分相当于在某个方向上的投影,小波这里就去寻找一个最佳的投影函数(a,b,t)a是时窗的中心频率,b是频率的量W,压缩降噪就是把频率特别小或者特别大的地方去掉,小波变换的其他具体知识之后再补充,此处介绍小波的MATLAB实现,stem()是柱形的画图函数,小波函数和尺度函数wavefun2()只适合正交小波,具体参照P387,
小波变换的压缩是基于人眼对高频信息不敏感的特性,低频部分的分量全部或部分保留,去掉高频的部分,系数编码时小波变换用于图像压缩的核心,压缩的实质是对系数的量化压缩,Y=wcodemat(X,nbc);%对图像的数值矩阵进行伪彩色编码,wcodemat还有 解压的能力,[C,S]=wavedec2(X,2,'db4'); %对图像小波分解,image()从数组显示图像,下图a,b分别是压缩和解压缩的图
Simulink是matlab的图像化编程工具,video and image processing blockset,此处介绍基于simulink的视频及数字图像处理,在下面这个地方启动,computer vision system toolbox需要先建立simulink,然后在里面的tool里面library找,输入在sources中设置图像路径,在sinks中的view观看结果,直接用鼠标把模块拖到simulink的工作空间或者右键直接add进来,用鼠标即可连线,类型转换是在convertion中,图像几何变换,双击模块可以修改里面的参数,其实一个模块就对应着一些matlab的语句,
Analysis&Enhancement Convertions
Filtering
形态学操作( Morephological Operations)