Top

本地磁盘小日记ヾ(≧▽≦*)ゝ

世界无限大.且行且珍惜w~
编码.计算机视觉.网络.语言.绘图在学/M2F/各种发烧友/死宅/见习公主w;

教程:通过MATLAB进行数字图像处理仿真的快速上手;

MATLAB是一款数学软件,是MatrixLaboratory(矩阵实验室)的缩写。它把数学中的矩阵和线性代数等知识和传统的计算机编程语言结合到了一起,并内置了丰富的库,让很多算法轻松实现仿真化成为了可能。比如,你通过数学写了一个二维图像灰度变换的函数公式,可以在matlab下轻松地像以C语言math情况下去描述它,并实现赋值计算,再通过它内置的图形计算库还可以把你的算法完完全全仿真出来。

MathWorks公司历史悠久、团队强大、产品专一。它的matlab产品可用于多种学术研究专业,这样首屈一指的软件使得它在全世界都十分流行。也是数字图像处理仿真的好帮手。本文送给从未接触过matlab的朋友们。


关于数图处理的一些前景知识;

图像处理系统基础设计的一个重要特点是测试和实验的有效程度。系统方法和快速原型候选解决方案的能力在减少运算开销和时间方面起着重要的作用。

一幅图像可以定义为一个二维函数f(x,y),其中x和y是空间坐标,而f在任意坐标(x,y)处的幅度称为图像在该点处的亮度和灰度。彩色图像是由多个单色图像组合而成。当x,y和f的幅值都是有限的离散值时,称该函数为数字图像。数字图像是由有限数量的数组组成的,每个元素都有一个特殊的位置和数值。这些元素称为图片元素(picture element)、图像元素(image element)和像素(pixels\pels)。

数字图像处理分为低中高三种处理: 低级处理包括原始操作(降低噪声、对比度增强..),输入输出都是图像。 中级处理(分割..),把图像分为区域或目标,然后对目标进行描述。输入是图像,输出是图像提取出的属性。 高级处理通过执行通常与人类视觉相关的感知函数,来对识别的对象进行总体确认。


matlab与数字图像处理的一些关系;

一幅图像可定义为一个二维数组f(x,y),其中x和y是空间(平面)坐标。图像关于x坐标、y坐标和幅度是连续的。将坐标值数字化称为采样,将幅值数字化称为量化。当x、y和幅值f都是有限的、离散的量时,我们称该图像为数字图像。

采样和量化得到的是一个实数矩阵。假设对一幅图像f(x,y)采样后得到一个M行、N列的图像。我们可以称这幅图像的大小是MxN,坐标的值是离散量。

这样,一幅二维数字图像就可以把它看做成一个矩阵函数f(x,y),把阵列的每个元素赋值就可以显示出东西。这个阵列的每个元素都称为图像元素、图画元素或像素。一个1N的矩阵被称为一个行向量,一个M1的矩阵被称为一个列向量。一个1*1的矩阵则被称为标量。

把二位数字图像看成矩阵,这样我们就可以轻松地在matlab中做各种仿真尝试惹。


matlab数据的表示和运算;

matlab的命令行(>>)窗口是我们操作matlab的一个重要媒介。

我们可以进行一些简单计算,比如把2+2的值赋给变量a。

1
a=2+2

如果输入的表达式后面加上分号;的话,那么结果就不会显示出来。还有,matlab的变量名是对大小写字母敏感的。它主要支持以下数值运算符:

1
+(加)、-(减)、*(乘)、/(除)、^(幂)、'(矩阵转制)。

同时,matlab中还提供一些预定义变量可以直接使用。

1
2
3
4
5
6
7
8
9
10
i或j    根号1
pi      π
abs     数值的大小(实数的绝对值)
angle   复数的角度,以弧度表示
real    求复数的实部
imag    求复数的虚部
cos     余弦函数,假设角度是弧度制
sin     正弦函数。假设角度是弧度制
exp     指数函数
sqrt    求平方根

matlab矩阵的表示和运算;

我们可以指定元素建立向量。创建一个1*4的行向量:

1
v=[1 3 5 7]; 或 v=[1,3,5,7];

也可以增加向量,变成1 3 5 7 8:

1
v(5)=8;

用等间隔元素建立向量:

1
t=0:.1:10;

这个命令创建了一个1*101的向量,元素为0,0.1,0.2,…,10。这个表达式中前面的数字表示初值,后面的数字表示终值,中间的数字表示增量。

函数linespace和logspace也可用于创建向量;

1
2
3
4
x=linespace(a,b,n);
a表初值,b表终值,n指定元素个数,默认n为100,x是1*n的线性等间隔分部的向量。
x=logspace(a,b,n);
a表示的向量初值为10的a次方,b表示终值为10的b次方,n指定元素个数,默认n为50,x是1*n的向量,这n个元素取以10为底的对数后在[a,b]间等间隔分布。

矩阵可以通过输入行列元素获得:

1
2
3
M=[1 2 4;3 6 8];
M=1.00  2.00    4.00
  3.00  6.00    8.00

矩阵特定位置元素可以通过下面的命令赋值:

1
M(1,2)=5;

用下面几个命令可以定义一些特殊矩阵:

1
2
3
4
M=[];            空矩阵
M=zeros(n,m);    n*m的0矩阵
M=ones(n,m);     n*m的1矩阵
M=eye(n);        n*m的单位阵

要得到向量或矩阵的规模可以用下面这两个函数:

1
2
[r,c]=size(A)   r、c分别为矩阵A的行数和列数
n=length(b)     n为向量b的长度

matlab部分基本常用功能;

波形的绘制:

1
2
3
4
5
6
7
8
9
10
11
12
13
plot            绘制曲线图
stem            绘制杆图
hold on         保留当前图形及坐标的全部属性
hold off        恢复图形设置缺省值
grid on         画网格线
grid off        去掉网格线
subplot(m,n,p)  将当前窗口分成m*n个子图,并选择在其中第p个上绘图
figure          创建图形窗口
xlabel          横轴标注
ylabel          纵轴标注
legend          在右上角建立一个图例说明盒
axis            确定坐标轴刻度范围
text            在图中特定位置标注

数据的输入和输出:

1
2
3
4
5
load my.mat     调用my.mat数据文件
load data.txt   调用txt文件,并生成与文件名同名的变量
save my t y     把变量t和y保存名为my.mat的二进制文件
save data.txt t y-ascii
把变量t和y保存名为data.txt的8位ASCII文件

其它常用matlab命令:

1
2
3
4
5
6
7
who     列出内存中的变量名
whos    列出内存中变量的详细信息
clc     清除命令窗口
clear   清除内存变量和函数
clf     清除图形窗口
sound   对声音进行回放
help    帮助

你还可以尝试在安卓或ios端安装matlab官方的远程软件操控电脑端的matlab,需要局域网环境和较新版本的matlab。

1
2
3
connector on
connector on password
connector off

matlab下的数字图像处理快速上手;

读入数字二维图像文件到matlab变量f:

1
f=imread('test.png');

在新的图形窗口显示变量f中的图像:

1
figure,imshow(f)

写入图像write函数(调整质量的范例):

1
2
imwrite(f,'test.png','quality','q');
q是0到100的一个整数,数字越小劣化越高

matlab提供惹一个图像处理工具箱,它把matlab数值计算环境扩展到图像处理的函数合集。

工具箱支持4种图像类型:

灰度级图像(Gray-scale images)

二值图像(Binary images)

索引图像(Indexed images)

RGB图像(RGB images)

类和图像类型:

1
2
3
4
5
6
7
8
9
10
double      双精度浮点数,范围±10的308次方(8byte/元素)
single      单精度浮点数,范围±10的38次方(4byte/元素)
uint8       无符号8字节整数,范围[0,255](1byte/元素)
uint16      无符号16字节整数,范围[0,65535](2byte/元素)
uint32      无符号32字节整数,范围[0,4294967295](4byte/元素)
int8        有符号8字节整数,范围[-128,127](1byte/元素)
int16       有符号16字节整数,范围[-32768,32767](1byte/元素)
int32       有符号32字节整数,范围[-2147483648,2147483647](4byte,元素)
char        字符(2字节/元素)
logical     值为0或1(1字节/元素)

类uint8和logical广泛地用于图像处理,浮点类double和single用于计算灰度的操作。

灰度级图像:一幅灰度级图像是一个数据矩阵,矩阵的值表示灰度的浓淡。

二值图像:一幅二值图像是一个取值只有0和1的逻辑数组。使用函数logical可将数值数组转换为二值图像。

1
2
判断c是否为二值数组:islogical(c)
转换变量A到g变为二值图像:g=mat2gray

matlab下的M文件;

M文件是大量MATLAB命令的集合,它以文本文件的形式存储,文件后缀".m"。M文件可以是一个有输入、输出变量的函数,也可以是一系列的命令脚本。可以直接放到matlab里执行。

引例,一个计算两数之和的函数:

1
2
3
4
创建:edit z
function z=yplus(y,x)
z=y+x;
调用:z=yplusx(2,3)
1
2
3
4
关系运算符:
<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、~=(不等于)。
逻辑运算符:
&(逐个元素"与")、|(逐个元素"或")、~(逐个元素"非")、&&(标量"与")、||(标量"或")。
1
2
3
4
5
6
7
8
9
流控制语句:
if          if与else和elseif一起,执行基于指定逻辑条件的一组语句
for         对一组语句执行规定次数
while       根据规定的逻辑条件,对一组语句执行不确定的次数
break       中止执行for或while循环
continue    将控制传递到for或while循环的下一次迭代,跳过循环体中所剩余的语句
switch      switch与case和otherwise一起,根据规定的值或字符串执行不同的语句组
return      使执行返回到调用参数
try...catch 若在执行过程中检测到错误,则改变流控制

matlab函数tic和toc可用于测量函数执行的时间。

1
tic;sinfun1(100);toc

函数timeit可用于得到函数调用的可靠的可重复的时间测量。

1
s=time(f)

利用矩阵和向量形式写的M文件效率比较高。循环和if语句也可以在matlab中使用,但是计算效率较低,所以要谨慎使用。

向量化说明和函数meshgrid的介绍。

我们用matlab基于如下公式写函数来创建一幅合成图像:f(x,y)=Asin(u0x+v0y)

for循环版:

1
2
3
4
5
6
7
8
9
function f=twodsin1(A,u0,v0,M,N)
f=zeros(M,N);
for c=1:N
    v0y=v0*(c-1);
    for r=1:M
        u0x=u0*(r-1);
        f(r,c)=A*sin(u0x+v0y);
    end
end

meshgrid向量版:

1
2
3
4
5
6
function f2=twodsin2(A,u0,v0,M,N)
    r=0:M-1;
    c=0:N-1;
    [C,R]=meshgrid(c,r);
    f2=A*sin(u0*R+v0*C);
end

检验:

1
2
3
timeit(@()twodsin1(1,1/(4*pi),1/(4*pi),512,512))
f=twodsin1(1,1/(4*pi),1/(4*pi),512,512);
imshow(f,[])

向量化形式运行的时间约可少50%。


本地磁盘姬

ohayou.aimo.moe

微博:@本地磁盘姬碟酱

Twitter:本地磁盘姬

2019年07月16日