前言

给一个算法如何写程序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数字图像处理


一,MATLAB基础

按下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)显示细胞数组的结构,

1.1矩阵的算术运算

对角矩阵eye(3),魔方矩阵magic(3),点乘.*,乘*,矩阵比较大小本质上也是一个一个的比返回的结构也是矩阵,就是对应元素是0,表示假,1表示真

>> A=[1 2 3;2 5 6];
>> B=[2 2 3;27 8 8];
>> cl=A<B

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
>>

1.2判断循环

选择结构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

1.3MATLAB绘图

MATLAB绘图步骤:

1)数据准备 确定变量的函数关系及取值范围,明确横坐标变量和纵坐标变量,计算出变量数据,

2)设置图形窗口位置在指定的位置创建新的绘图窗口,缺省是打开figureN01

3)绘制图形,生产图形文件:创建坐标轴,调用绘图函数,设置图形中线型,色彩,数据点形等属性

4)图形的修饰:为了突出图形显示结果,可对生成的图形文件做进一步调整如设置坐标轴的范围和刻度,图形注释(图名,坐标名文字说明等

5)保存和导出图形,按指定文件格式保存图形导出图形,以方便后续使用

1.3.1二维图形绘制

使用函数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既可以是变量,也可以是矩阵,一般习惯用小写表示变量,大写表示矩阵,

二,MATLAB图像处理基础

1)主要介绍matlab图像处理工具箱可以从help--图形处理工具箱,还可以从左下角start打开;

2.1图像类型的转换

图像类型的转换,可以用对应的函数来完成,图像的转换如下图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)%显示索引图像的

2.2文件信息的读取保存

文件信息的读取,用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帧/秒

三,数字图像的点运算

3.1图像点运算

图像点运算,点运算又称对比度增强,对比度拉伸或灰度变换,是对通过图像中一个像素值,进行运算的图像处理方式B(x,y)=f(A(x,y)),J = imadjust(I,[low_in; high_in],[low_out; high_out],gamma)

将图像 I 中的亮度值映射到 J 中的新值,其中 gamma指定描述值I和值J关系的曲线形状。如果gamma小于1,此映射偏重更高数值(明亮)输出,如果gamma大于1,此映射偏重更低数值(灰暗)输出,如果省略此参数,默认为(线性映射)。 
[M,N]=size(J);          %获得灰度图像数据J的行列数M,N,用imadjust()直接就对RGB图像进行操作,而利用分段线性处理和对数函数处理,都要先把RGB图像转为灰度图像,分段的时候是对坐标分段,也可以根据灰度值进行分段
图像的空间变换,在MATLAB中图像处理工具箱提供一个专门的函数intransform(),用户可以定义参数实现多种类型的空间变换,包括放射变换(如平移,缩放,旋转,剪切),还有医学上常用的投影变换,B=imtransform(A,TFORM),TFORM是函数maketform()返回的一个结构体,调用格式如下图一,custom可以实现投影变换和放射变换,放射性变换中原图像中某个像素点坐标(x,y)和变换后该像素点坐标(x',y'),关系如下图二,其实这种变换就是矩阵中的坐标变换,变换前的坐标乘上一个矩阵得到变换后的坐标(x',y')
图一                                                                    图二                                                   图三
主要步骤就是生产结构体,调用结构体imtransform(),需要maketform()函数的配合,size(1,2)可以得到函数的列数,技术数组的大小,xData,YData就是对X,Y的数据范围进行限制,size(I,2)表示取出I中列数,size(I,1)取出I中的行数,fillvalue是对矩阵的填充
>> Ia=maketform('affine',[cosd(30) -sind(30) 0;sind(30) cosd(30) 0;0 0 1]);
>> Ib=imtransform(I,Ia);
平移后的溢出J=ones(M,N,G); 就是不考虑,J=ones(M+abs(a),N+abs(b),G);  %初始化新图像矩阵全为1,大小根据考虑x轴和y轴的平移范围,也就是说平移后的图形如果不对矩阵进行扩大,图像是不能完全显示的

3.2图像的领域操作

图像的领域操作,在MATLAB中提供了几个实现领域操作的函数,用户可以直接调用这些函数,实现各种操作,通用滑动领域操作函数nlfiler(),列方向领域操作函数colfilt(),分离领域操作函数blockproc(),@符号主要使用于匿名函数,充当函数句柄,如下图所示:比如没有In函数但是有log函数我们可以使用ln=@(x)log(x)就可以调用log了有点像给函数重新命名,X是参数,blockproc()就是 把函数 分为一小块一小块的,调用格式为blockproc(A,[M,N],fun),加入fun这个句柄就是说在分离的同时可以再做旋转等,

图像的区域选取,可以找到我们感兴趣的区域进行相关操作,MATLAB也提供了一些图像区域选择和操作函数,如多边形区域选择函数roipoly(),是基于区域,roipoly(I,c,r)坐标选择灰度ROI区域选择函数roicolor(),roicolor(I,low,high);根据灰度的范围进行选取,区域填充函数roifill(),就是选择出来的区域,涂上一种颜色,区域滤波函数roifilt2(),介绍一个掩模的概念:就是用一个有洞的纸张挡住图像所看到的部分,h = fspecial(type),是滤波函数

四,图像增强

图像增强空间域也叫对比度增强,灰度增强只改变像素点的灰度值,并逐点进行,和周围的其他像素点无关,为了进行灰度变化首先要获得灰度直方图在MATLAB中可以使用imhist(I)函数来获得,彩色图像也可以做直方图,只不过是对三个分量RGB分别做灰度直方图,直方图均衡化用的是histeq(I),直方图均衡化使得图像的色彩分布更加的均匀,不会出现过明或者是过暗的情况,图像的标准差,可以采用std2()计算矩阵的标准差,std()计算向量的标准差,标准差越大,图像的对比度越大,mean()平均值函数,中值滤波函数medfilt2(I),计算两幅大小相同的图像的相关系数用,corr2(I,J);灰度图像的等高线就是灰度相同的点连接成的,利用imcontour(I,n),n是绘制的等高线的数量,

4.1空域滤波

空域滤波:线性平均滤波是一种最常用的线性空域滤波,图像的边缘属于高频成分,常用的模板有3x3的,K=imfilter(J, h),表示J卷积H的意思,可以用这个函数或者conv2(J,H)也可以,加噪声的函数imnoise(I, 'salt & pepper', 0.02);顺序统计滤波函数ordfilt2(I, 1, true(5));就是有点像领域滤波的感觉就是用领域内的第一个像素代替目标像素,true(5)表示用5*5的模板,维纳自适应滤波函数是wiener2(J, [5 5]);

4.2频域滤波

频域滤波图像增强首先是通过傅里叶变换将图像从空间域变换到频率域,然后反变换回去,频域内的图像增强有低通滤波,高通滤波和同态滤波;低通去除噪声,但是也会使得边缘模糊,matlab里面的字母是分大小写的,Y = fftshift(X);平移零频分量,然后绘制以零为中心的功率,也就是零点跑到中间去了,Y = fft2(X,m,n) 将截断 X 或用尾随零填充 X,以便在计算变换之前形成 m×n 矩阵。Y 是 m×n 矩阵。如果 X 是一个多维数组,fft2 将根据 m 和 n 决定 X 的前两个维度的形状;[X,Y] = meshgrid(x,y):输出X的每一行的数值都是复制的x的值;输出Y的每一列的数值都是复制的y的值,meshgrid就是产生这样两个矩阵,时域卷积频域乘积K=J.*H;,c=b(1:size(b,1),1:size(b,2))表示取出b的这些行和列上的元素,赋值给c,最后一个值不超过size(b,1)的一个向量,size(b,1)是b矩阵的行数,表示求距离函数D=sqrt(U.^2+V.^2);滤波器的类型分为巴特沃斯滤波器和高斯滤波器,带阻滤波器是用来抑制距离频率中心一定距离的一个圆形区域的频率,可以用来消除一定频率范围内的噪声,同态滤波是一种特殊的滤波技术,可用于压缩图像动态范围,且增强对比度,滤波窗口越大图像边缘越模糊,图像去燥效果越好

五,图像复原技术

5.1空域滤波复原

图像复原技术,可以通过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和图像的噪声估计。

5.2图像复原

图像复原: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。

十,图像形状特征

10.1形状特征描述

形状特征描述一般是在物体从图像中分割出来以后进行分析,主要包括图像的轮廓提取和区域划分:先对轮廓进行描述在对边界特征进行描述,链码表示方法就是定好起点后,用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()函数用于缩小图像,还有一种方法矩描述

10.2形态学数字图像处理

形态学数字图像处理,数字形态学是建立在微分几何以及随机论基础上的,集合论是数学形态学的基础,腐蚀运算和膨胀运算是数学形态学的两个基本变换,参与运算就是两个对象,,图像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数字图像处理

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)

MATLAB数字图像处理详细总结相关推荐

  1. 《精通Matlab数字图像处理与识别》一6.2 傅立叶变换基础知识

    本节书摘来自异步社区<精通Matlab数字图像处理与识别>一书中的第6章,第6.2节,作者 张铮 , 倪红霞 , 苑春苗 , 杨立红,更多章节内容可以访问云栖社区"异步社区&qu ...

  2. matlab数字图像处理课程设计报告,数字图像处理初步-实验1

    MATLAB数字图像处理初步 通过实验对MatLab软件的基本使用基本的了解,学会使用MatLab软件来读取一个特定格式的图像,并通过相关的命令语句对图像进行格式转换.图像压缩.二值化等的处理,掌握利 ...

  3. matlab对于处理数字图像的优点,学习MATLAB数字图像处理经验谈

    学习MATLAB数字图像处理经验谈 学习数字图像处理经验谈 (赵小川) 一.面向应用:层层分解.抓住要点 我们学习数字图像处理的最终目的还是应用,不管是用它来研制产品还是研发项目抑或是研究课题,都要用 ...

  4. MATLAB数字图像处理系统[多功能]

    MATLAB数字图像处理系统[多功能] 目录 实验一 MATLAB数字图像处理初步 实验二 图像的代数运算 实验三 图像增强-空间滤波 实验四 图像分割 2 实验一 MATLAB数字图像处理初步 一. ...

  5. MATLAB 数字图像处理GUI二值图像实验

    电信19-2 翁大弟 摘要 图像信息是人类获取信息的重要来源及利用信息的重要手段,数字图像处理的产生和迅速发展主要受三个因素的影响:一是计算机的发展:二是广泛的农牧业.环境.军事.工业等方面的应用需求 ...

  6. matlab fspeical,MATLAB数字图像处理.doc

    MATLAB数字图像处理 MATLAB常用图像操作 转换图像类型 例1.对一幅图像进行二值化处理,代码及结果如下: load trees BW=im2bw(X,map,0.4); imshow(X,m ...

  7. Matlab数字图像处理——图像处理工具箱Image Processing Toolbox

    Image Processing Toolbox 图像处理工具箱包含的功能: 图像的读取和保存 图像的显示 创建GUI 图像的几何变换 图像滤波器设计及线性滤波 形态学图像处理 图像域变换 图像增强 ...

  8. Matlab数字图像处理——图像文件的读取

    文章目录 一.Matlab中获取图像信息的函数 imfinfo 二.Matlab读取图像文件的函数 imread 三.Matlab保存图像文件的函数 imwrite 完整目录 一.Matlab中获取图 ...

  9. 【基于matlab数字图像处理GUI代码】_数字图像处理考核论文_大作业_项目

    基于matlab数字图像处理GUI代码 代码: function varargout = Image_processing_GUI(varargin) % IMAGE_PROCESSING_GUI M ...

  10. MATLAB说明图像增强,MATLAB数字图像处理(二)图像增强

    1         图像增强 1.1            直方图均衡化 对于灰度图像,可以使用直方图均衡化的方法使得原图像的灰度直方图修正为均匀的直方图. 代码如下: 1 2 3I2=histeq( ...

最新文章

  1. Android Android应用开发实战 学习总结杂项
  2. Java并发学习三:银行转账的死锁问题解决及示例
  3. LDD3源码分析之阻塞型I/O
  4. 王子与公主的另类结局
  5. Linux——文件打包与压缩
  6. 【Android-功能】Android应用增量更新
  7. PhantomJS快速入门教程(转)
  8. SAP成都研究院小伙伴们开发的一个SAP C4C POC - 通过名片扫描的方式录入联系人数据到系统
  9. PaddlePaddle开源平台的应用
  10. log4j2 mybatis 显示 sql 和 结果集
  11. AngularJs ngIf、ngSwitch、ngHide/ngShow
  12. 超级弱口令检查工具使用简介
  13. Java实现特征保持的图像加密算法
  14. python3_fake_User-Agent_创建UA伪装
  15. 2019年IT及大数据行业趋势
  16. OPNsense用户手册-硬件要求
  17. box-sizing属性是什么
  18. 桔梗载药上浮 柴胡升于左 升麻生于右
  19. bootStrap 搜索框
  20. java excel 打不开_Java使用POI生成Excel文件后打不开的问题

热门文章

  1. matlab均值滤波代码6,均值滤波matlab程序代码
  2. C语言入门20个简单程序|最新更新2021.7.13
  3. `Shell`高级编程 Day02 —— Shell脚本初步入门
  4. 无pygame写一个python贪吃蛇
  5. excel批量插入图片url显示方法
  6. Bilinear Pairing双线性配对的解释
  7. 通信算法之二:信道编码译码 BCH码、RS码、卷积码、Turbo码、LDPC码
  8. dspemif怎么读_DSP技术在EMIF接口中的BOOT方法简析
  9. 简单的Map集合练习题
  10. 排队论的计算机模拟,系统容量有限的一类排队论模型的计算机模拟研究