1. 数字图像处理和Matlab基础

1.1 数字图像处理的基本概念

1)图像:二维函数f (x, y)
(1)x, y : 空间坐标
(2)(x, y)上的幅值 f : 该点图像的强度或灰度

2)数字图像
(1)x, y和幅值 f (x, y)为有限的离散数值
(2)像素Pixel是数字图像的基本元素

3)数字图像处理
(1)数字图像处理就是利用数字计算机对数字图像进行处理。
(2)数字图像几乎覆盖了整个电磁波谱。DIP可以对各种来源的图像进行操作,包括超声、电子显微镜和计算机生成的图像

1.2 Matlab基础

1)Matlab是一个以数组为基本数据元素的交互式系统。它是一种用于技术计算的高性能语言,这允许为许多技术计算问题,特别是那些涉及矩阵表示的问题,制定解决方案。相比标量非交互式语言(如C或Fortran),编写MATLAB程序所需的时间更少。它将计算、可视化和编程集成在一个易于使用的环境中。它是高校(数学、工程和科学)和企业(研究、开发和分析)人员的一种强有力的算法开发工具。

2)Matlab的典型应用包括:
• 数学和计算
• 算法的开发
• 数据采集
• 建模、仿真和原型
• 数据分析、探索和可视化
• 科学与工程制图
• 应用程序开发,包括图形用户界面构建

3)MATLAB包含一系列用于各种应用程序的工具箱:
• 图像处理工具箱(IPT):扩展MATLAB环境用于解决数字图像处理问题
• 其他用来补充IPT的工具箱还有信号处理、神经网络、模糊逻辑和小波工具箱

1.2.1 数字图像的表示(注意matlab从1开始)

1)图像的矩阵存储形式:
在这里插入图片描述
2)Matlab中图像的矩阵存储形式:
在这里插入图片描述

1.2.2 读取图像

1)图像的存储格式有如下几种:
在这里插入图片描述
2)使用MATLAB IPT工具箱读取一幅图像:

f=imread('bird.jpg');

(1)Imread从当前目录读取文件,如果失败,它将尝试在搜索路径中找到该文件
(2)请注意分号( ;)。如果把它擦掉,命令窗口将显示图像的矩阵值

3)获取图像的信息
(1)size(f):显示图像的分辨率信息

ans = 230 352 3

(2) whos f:显示字节数

Name Size Bytes Class
f 230x352x3 242880 uint8 array
Grand total is 242880 elements using 242880 bytes

(3)imfinfo(’bird.jpg’)show more info than whos

1.2.3 显示或写入图像

imshow(f)
imshow(f, G)
imshow(f,[low,high])
imshow(f,[ ])

imwrite(f,’filename’)
imwrite(f,’filename’,’ext’)
imwrite(f,’filename’,’quality’,q)

质量指标 q 的范围是0到100,值越低,图像质量越差,压缩率越高

1.2.4 图像类型

1)强度图像/灰度图像
(1)灰度图像是一个数据矩阵,它的值被缩放以表示强度。
(2)当灰度图像的像素是uint8或uint16类型时,它们的取值是[0,255]或[0,65535]范围内的数。
(3) 如果图像是double类型的,则像素值为浮点数。按照惯例,经过缩放之后double类型的灰度图像的像素值落在[0,1]范围内
2) 二值图像
(1)二值图像是由0和1组成的逻辑阵列。
(2)数值阵列使用逻辑函数转换为二值。
(3)如果A包含0和1以外的元素,则使用逻辑函数将所有非零数值转
换为逻辑真(1),并将所有值为0的项转换为逻辑假(0)
3)索引图像和RGB图像
(1)图像可以是索引图像的,也可以是真颜色图像。索引图像将颜色作为索引数组存储colormap图中。
(2)真彩色图像不使用colormap;相反,每个像素的颜色值直接存储为RGB三元组。
(3)在MATLAB中,真彩色图像对象的CData属性是一个三维(m×n×3)数组。这个数组由三个m×n矩阵组成,它们沿着第三维连接在一起。

1.2.5 数据类型:

在这里插入图片描述

1.2.6 数据类型和图像类型之间的转换

1)通常我们将图像称为“数据-图像类型”的图像。例如“unit8强度图像”仅指代像素值是unit8类型的强度图像。
2)数据类之间的转换很简单。一般语法是:

B = data class name(A)

3)其中数据类名是数据类表第一列中的名称之一。例如,假设A是一个uint8类型的数组。精度更高的double类型数组B是由命令B = double (A)生成的。这种转换在整本书中都很常见,因为MATLAB希望数值计算中的操作数是双精度浮点数。
4)对于uint8, logical数据类型, 类型转换可以轻松地无损实现。
5)对于double类型,将其转换为任何目标类型时,任何超过目标类型表示范围的取值将由对应的边界值替代。
6)如果将double类型的矩阵转换为整型,所有的小数转换为整数时都将忽略小数部分
7)如果将double类型的矩阵转换为逻辑类型的矩阵,非0的数值型数据转换成逻辑真,即1;等于0的数值转换成逻辑假,即0。
8)工具箱提供了特定的函数进行尺度放缩,为图像数据类型转换做准备。IPT中的下列函数可用于进行图像中数据类型的转换。

在这里插入图片描述
9)函数 im2uint8 可以检测输入的数据类型,并为工具箱执行所有必要的缩放以将数据识别为有效的图像数据。例如,考虑下面的2×2大小的double类型图像,这可能是一个中间计算的结果:

f= 	-0.5 0.5
	0.75 1.5
G=im2uint8(f)
G=
		0 128
		191 255

10)若需要将任意double类型的矩阵转换为放缩到[0,1]区间的double类型矩阵,可以使用mat2gray函数实现该功能,其基本语法为:

G =mat2gray(A,[Amin,Amax])

11)其中图像G中像素取值在区间[0,1]之间,0代表纯黑,1代表纯白。参数Amin和Amax的存在使得A中所有小于等于Amin值的像素值变成0,所有大于等于Amax的像素值变成1。如果不显式给出Amax和Amin,则Amax和Amin会被设置为A中实际最大和最小的像素值。例如:

G = mat2gray(A)
A=[128,300;-12,66.98];
G=mat2gray(A,[0,255])
G=
	0.5020 1.0000
	0 0.2627
G=mat2gray(A)
G=
	0.4487 1.0000
	0 0.2531

1.2.7 索引

1)数组索引:
为了方便数组处理和提高编程效率,MATLAB提供了一系列的强有力的索引组合:
•向量索引
•矩阵索引
•常用函数

(1)向量索引:1 × N 的数组被称为行向量。

v=[1 2 3 4]
w=v'		//代表v的共轭转置
w(1:end)	//代表w的第一个到最后一个
zeros(1,4)

(2)矩阵索引:矩阵在MATLAB中可以很方便地表示:将一系列行向量用方括号括起来,行向量之间用逗号隔开。

A=[1 2 3;4 5 6]
A=rand(4,4)		//4*4随机矩阵
A=magic(5)		//5*5magic矩阵
A=5*ones(3,3)	//3*3矩阵 每个元素都是1
A(1,2)
A(:,2:4)		//所有行的第2-4列

//默认都是以列为单位计算 A(:)表示将矩阵排成n行一列的向量
sum(A)sum(A(:))不一样
mean(A)mean(A(:))
max(A)max(A(:)) 或者 max(max(A))
min(A)min(A(:)) 或者min(min(A))

(3)常用函数:将3x4的矩阵调整为2x6矩阵:

A= 	1 4 7 10
	2 5 8 11
	3 6 9 12
B = reshape(A,26)
B =
	1 3 5 7 9 11
	2 4 6 8 10 12

1.2.8 操作符

1)数值运算符
在这里插入图片描述
2)比较运算符
在这里插入图片描述
3)逻辑运算符
在这里插入图片描述
4)逻辑函数
在这里插入图片描述
5)常用函数
在这里插入图片描述
6)一些常量和变量
在这里插入图片描述

1.2.9 语句关键字:

If, for, while, break, continue, switch, return, try…catch
在这里插入图片描述

1.2.10 代码优化:

MATLAB 语言专门针对矩阵运算进行了优化。尽可能地利用这一优势可以极大地加快计算速度。
1)循环向量化
(1)向量化是指将for循环和while循环转换为等价的向量或者矩阵操作。
(2)循环向量化之后代码长度将明显缩短,这不仅可以带来计算速度的显著提高,还能提高代码可读性。例如:

f (x) = Asin(x/2pi)
for x = 1:M
f(x) =A*sin((x-1)/(2*pi));
end

下面的代码更加高效:

x=0:M-1;
f = A*sin(x/(2*pi));

类似地,使用meshgrid函数可以对 f (x, y) = Asin(ux + vy)的计算过程进行优化

[C,R]=meshgrid(c,r)

这个函数将行向量c和r指定的域转换为数组C和R,可以用于两个变量的函数的估值和三维曲面的绘制(注意,在meshgrid的输入和输出中都将列放在了第一个参数的位置)。例子:

c=[0,1] r=[0 1 2]
[C R]=meshgrid(c,r)
C = 0 1
	0 1
	0 1
R = 0 0
	1 1
	2 2

2)数组预分配:在处理数字或逻辑数组时,预分配是指创建特定维度的元素全部为0的数组。例如,如果我们要处理图像f和g,两幅图像的大小都是1024×1024,预分配的语句如下

f=zeros(1024); g=zeros(1024);

在处理大型数组时,预分配有助于减少内存碎片。动态内存分配可能会导致内存碎片化,这带来的结果是,在计算过程中内存中可用空间有很多,但是没有足够的连续内存来容纳一个大变量。通过允许MATLAB在计算开始时为大型数据结构保留足够的内存,预分配有助于防止这种情况的发生。

1.2.11 交互式 I/O

1)disp(argument):如果参数是数组,则显示其内容。如果参数是文本字符串,则disp显示字符串中的字符。例如:

A=[1 2; 3 4];
disp(A);
sc='Digital image processing';
disp(sc);

2)input():例子:

t=input('Enter your data:','s')
class(t)
size(t)
n=str2num(t)
size(n)
class(n)
t='12.6, x2y, z';
[a,b,c]=strread(t,'%f%q%q','delimiter',',')
a =
	12.6000
b =
	'x2y'
c =
	'z'

3)strcmp(s1,s2):如果字符串s1和s2相同,则返回1,否则返回0例子:

strcmp(b,'x2y')
strcmp(b,'z')

1.2.12 元胞/单元数组(Cell arrays)和结构体(structure)

1)元胞数组:元胞数组是一个多维数组,元胞数组里面的元素是其他数组元素的复制。
例如:

 c={’gauss’, [1 0;0 1],3}

2)结构体:结构体同元胞数组非常类似,在某种意义上,它们允许将不同数据的集合分组到单个变量中。
例如:

S.char='gucas', S.matrix=[1 0;0 1], S.scalar=3;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值