数字图像处理(Matlab)读书笔记

来源:互联网 发布:系统域名免费注册 编辑:程序博客网 时间:2024/04/29 09:35

数字图像处理(matlab)----基本原理

1.数字图像的表示

一幅图像可以被定义为一个二维函数f(x,y)其中x和y是空间(平面)坐标,f在任何坐标点(x,y)处的振幅称为在该点亮度。将坐标值数字化称为取样,将振幅数字化称为量化,当f的x,y分量和振幅都是有限且离散的量时,称该图像为数字图像。

1.1坐标约定

假设对一幅图像f(x,y)取样后,得到了一副有着M行和N列的图像,我们称这幅图像的大小为M×N。坐标(x,y)的值是离散的。在很多图像处理书籍中,图像原点定义在(x,y)=(0,0)。matlab图像处理工具箱中该坐标系统的原点在(r,c)=(1,1)处。

1.2图像的矩阵表示


等式右边是由定义给出的一幅数字图像,该数组中的每一个元素称为像元,图元或像素。一幅图像在matlab表示成矩阵


一个1×N矩阵称为一个行向量,而一个M×1矩阵称为列向量。一个1×1矩阵是一个标量。

1.3读取、显示、保存图像

使用imread函数可以将图像读入MATLAB环境,imread的语法为imread(‘filename’);函数size可给出一幅图像的行数和列数;函数whos可以显示出一个数组的附加信息;函数imshow显示图像;可用函数figure来同时显示两幅图像;函数imwrite将图像写到磁盘上,函数语法为imwrite(f,‘filename’);函数imfinfo保存一幅图像。下边给一个完整的例子并附上结果:

程序:

f =imread('E:\dip\p02-01.bmp');%说明路径+图片名称

g = imread('p02-02.tif');%如果图片在所编写的文件夹内则不需要说明路径

[M,N] = size(f);

whos f                   %运行结果对应结果图片1

imshow(f);               %运行结果对应结果图片2

figure;imshow(g);        %运行结果对应结果图片3

imwrite(f,'patient2.jpg','quality',25);%运行结果对应结果图片4

imfinfo patient2.jpg     %运行结果对应结果图片5

k = imfinfo ('patient2.jpg');

 

运行结果:

                                                                  图1

                                                                  图2


                                                          图3

              

                                                              图4

                                                       图5

备注:imshow函数还有如下用法:imshow(f,G)其中f是图像数组,G是显示该图像的灰度级数,若将G省略,则默认的灰度级数是256。imshow(f,[lowhigh])会将所有小于或等于low的值都显示为黑色,所有大于或等于high的值都显示为白色,介于low和high之间的值将以默认的级数显示为中等亮度值。imshow(f,[])可以将变量low设置为数组f的最小值,将变量high设置为数组f的最大值。

上述代码中的imwrite函数将保存的图像进行了压缩(保存的格式为jpg),可以省略后边的参数,不进行压缩。

1.4数据类和图像类型

数据类:double  双精度浮点数(8bit每像素);

uint8   无符号8bit整数(1bit每像素);

uint16  无符号16bit整数(2bit每像素);

uint32  无符号32bit整数(4bit每像素);

int8    有符号8bit整数(1bit每像素);

int16   有符号16bit整数(2bit每像素);

int32   有符号32bit整数(4bit每像素);

single  单精度浮点(4bit每像素);

字符类: char   字符(2bit每像素);

逻辑数据类: logical   值为0或1 (1bit每像素);

MATLAB中所有的数值计算都可用double类进行,是图像处理应用中最常用的数据类。uint8主要是从存储设备读取数据时频繁使用,只需要1个字节。

图像类型: 亮度图像、二值图像、索引图像、RGB图像等

图像类和数据类之间的转换:

以下主要以代码和运行结果的形式解析:

1.代码:  f =[-0.5,0.5;0.75,1.5];

g = im2uint8(f);

g

运行结果:g =

              0  128

             191 255

分析:函数im2uint8将输入中所有小于0的值设置为0,而将输入中所有大于1的值设置为255,再将所有的其他值乘以255.

2.代码:f = [1,2;3,4];

g = mat2gray(f);

g

运行结果:g =

         0   0.3333

    0.6667   1.0000

分析:要把一个double类的任意数组转化成取值范围为[0,1]的归一化double类数组,可以通过函数mat2gray完成。

3.代码: f = uint8([125 50;128 200]);

g = im2double(f);

g

运行结果:g =

     0.4902    0.1961

0.5020    0.7843

分析:当输入uint8类数据时,转换只是简单的将输入数组的每个值都除以255.

4.代码: f = [1,2;3,4];

g = mat2gray(f);

gb = im2bw(g,0.6);

gb

运行结果:gb =1+

     0    0

     1    1

分析:函数im2bw的语法为g=im2bw(f,T),该函数通过阈值处理,将一幅亮度图像f转换为一幅二值图像g。T的取值在[0,1]内。默认为0.5。图像会归一化,然后和阈值进行比较。

1.5数组索引

向量索引:维数为1×N的数组称为行向量,行向量中元素的存取是使用一维索引进行的,V(1)是向量    V的第一个元素,Matlab中向量的元素使用方括号括起,并有空格或者逗号隔开,如:v=[1 2 3 45 6];使用转置运算符( .’)可将行向量转换为列向量;要存取元素的数据块,可以用冒号,如V(1:3),V(1:end),end表示向量中最后一个元素,V(1:2:end)表示索引从1开始,步长为2,直到最后一个元素停止,同时步长可以为负值,索引从end开始;

矩阵索引:在matlab中,矩阵可以用一列被方括号括起并用分号隔开的行向量表示,如:A = [1 2 3; 4 5 6; 7 8 9]显示了3×3矩阵;从矩阵中提取元素和从向量中提取元素是一样的,需要两个索引,一个用于确定行位置,一个用于确定列位置,如A(1,2);矩阵索引使用冒号操作符来对矩阵中选择一个二维元素块,如C3 = A(:,2),会将第二列所有元素输出;sum(A(:))会将向量中的所有元素相加;通过矩阵索引可以进行简单的图像操作,如垂直翻转,裁剪图像,扫描某一行或者某一列元素值等。

1.6一些重要的标准数组

zeros(M,N)生成一个大小为M×N的double类矩阵,其元素均为0;

ones(M,N)生成一个大小为M×N的double类矩阵,其元素均为1;

true(M,N)生成一个大小为M×N的logical类矩阵,其元素均为1;

false(M,N)生成一个大小为M×N的logical类矩阵,其元素均为0;

magic(M)生成一个大小为M×N的”魔术方阵”;

rand(M,N)生成一个大小为M×N的矩阵,矩阵中的元素都是在区间[0,1]中均匀分布的随机数。

randn(M,N)生成一个大小为M×N的矩阵,矩阵中的元素是正态分布的随机数,随机数均值为0,方差为1。

1.7M函数变成简介

M文件由文本编辑器创建,并以filename.m形式的文件名存储,M文件函数的组成部分为:函数定义行、HI行、帮助文本、函数体、命令,函数定义行的形式为function [outputs] = name(inputs);HI行是第一个文本行,它是单个注释行,其前面为函数定义行;帮助文本是紧跟在HI行后面的文本块,二者之间wu空行,帮助文本用来为函数提供注释或在线帮助;函数体包含了所有执行计算并给输出变量赋值的Matlab代码;

算术运算符:矩阵算术运算符由线性代数的规则定义,数组算术运算符可以逐个元素地执行,并且可以用于多维数组,句点(圆点)字符( .)用来区分数组运算符和矩阵运算符。例如,A*B表示传统意义上的矩阵乘法,而A.*B则表示数组乘法.其余运算符(+,-,/,^)均相同.

关系运算符: 运算符A==B(<,<=,>,>=,~=)生成一个与A和B维数相同的逻辑数组,当A与B的相应元素匹配时,新数组中的相应位置取1,其余位置取0;

逻辑运算符:(&,|,~,xor(异或),all(若向量中的所有元素都非零,则返回1),any(若向量中的任一元素都非零,则返回1))Matlab将逻辑1或者非零数值量作为true来处理,将逻辑0和数值0作为false来处理.

流控制:

1.  if expression1

  statements1

elseif expression2

  statements2

else

statements3

end

2.  for index = start:increment:end

statements

       end

3.  while expression1

statements

       end

4.  break是结束整个循环体,continue是结束单次循环

5.  switch switch_expression

  case case_expression

      statement(s)

   case {case_expreeion1,expression2,…}

      statement(s)

  otherwise

      statement(s)

end

    6.交互式I/O: 函数disp用来在屏幕上显示信息,disp( argument );函数input用于将数据输入到M函数,t = input(‘message’);若要求输入为数字,可使用函数str2num将串的元素转换为double类数字, n = str2num(t);若输入既有字符又有数字,用strread函数;

 

 

 

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕6个月咳嗽很厉害怎么办 家门口有电线杆影响我建楼房怎么办 卡丢了不知道卡号怎么办 驾考网上预约用户被锁定了怎么办 人才中心拿出来的户口掉了怎么办 父母是南京集体户孩子没户口怎么办 二建挂靠中介单位不给证怎么办 小包工头遇到工人在工地摔伤怎么办 外地人买了城中村的房子改造怎么办 深圳社保怀孕了产检异地怎么办 成都公租房租满6年怎么办 二建审核资料如果照片丢失怎么办 身份证被冒用在外地办社保怎么办 蔷薇的嫩叶都被太阳晒死了怎么办 乐视手机进水了屏幕失灵怎么办 乐视手机进水了屏幕不显示怎么办 美团商家单量出现下滑怎么办 想开个小超市没经营过怎么办 华为7c手机wifi信号差怎么办 贞子从电视里爬出来怎么办 2个月的婴儿吓到怎么办 排卵日同房了没避孕怕怀孕怎么办 妻子因为我欺骗她要跟我离婚怎么办 老婆用苹果手机共享我的位置怎么办 孕妇餐后2小时血糖偏高怎么办 孕妇血糖餐后2小时数值高怎么办 股市退市的话股民的钱怎么办 美股股票退市了手里的股票怎么办 坐高铁安检时怕把包包弄坏了怎么办 很贵的包包高铁安检怎么办 如果过高铁安检东西被扣留怎么办 邻居家小孩把我家东西弄坏了怎么办 邻居早上6点放音乐扰民怎么办 隔壁楼邻居天天放音乐很吵怎么办 发现老公在卧室安了摄像头怎么办 憋的尿又没有厕所的时候怎么办 一岁宝宝拉屎总是拉出血怎么办 孩子鼻窦炎鼻子堵有白色鼻涕怎么办 家里阳台上老是有蝙蝠趴着怎么办 空调太冷在空调房里该怎么办 分手了怎么办不要挽回要重新吸引