目录
13.2 预分配数组(Preallocating Arrays)
一、图像相关操作
1、数字图像的表示
- 坐标约定:
- 数字图像用二维矩阵表示,像素坐标以 (x, y) 表示。
- 矩阵表示:
- 图像的每个像素对应矩阵中的一个元素,值代表灰度或颜色强度。
- 在 MATLAB 中,矩阵索引从 1 开始,与传统的从 0 开始的数组有所不同。
2、读取图像
- 支持的图像格式:
- 常见格式包括 TIFF、JPEG、GIF、BMP、PNG、XWD 等。
- 读取方法:
- 使用 MATLAB 的
imread
函数,例如f=imread('bird.jpg');
。 - 注意:
- 文件需位于当前目录或搜索路径中。
- 忽略分号会直接显示图像矩阵的值。
- 使用 MATLAB 的
3、获取图像信息
(1)size(f)
:
- 返回图像矩阵的维度(行、列和通道数)。
- 例如,
230x352x3
表示图像高 230 像素,宽 352 像素,有 3 个通道(通常为 RGB)。
(2)whos f
:
- 提供变量
f
的详细信息,包括大小、字节数和数据类型。 - 数据类型为
uint8
,即每个像素值占用 1 字节。
(3)imfinfo('bird.jpg')
:
- 提供图像文件的元数据,如文件名、修改日期、大小、格式、位深度、颜色类型等。
- 用于更全面的图像属性检查。
4、显示图像的函数
(1)imshow(f)
:直接显示图像 f
。
(2)imshow(f, G)
:使用给定的灰度值范围 G
显示图像。
(3)imshow(f, [low, high])
:指定像素值范围 [low, high]
的显示。
(4)imshow(f, [])
:自动缩放像素值以适应显示。
5、保存图像的函数
(1)imwrite(f, 'filename')
:保存图像 f
为指定文件名。
(2)imwrite(f, 'filename', 'ext')
:指定文件格式。
(3)imwrite(f, 'filename', 'quality', q)
:设置保存图像的质量,q
范围为 0-100(值越低,压缩越高)。
6、数据类型及图像类型
6.1 图像类型
- 灰度图像(Intensity Image):
- 数据矩阵的值表示亮度。
- 数据类型可为
uint8
(范围 0-255)或double
(范围 0-1)。
- 二值图像(Binary Image):
- 仅包含 0 和 1 的逻辑矩阵。
- 可通过
logical
函数将数值矩阵转换为二值图像。
- 索引图像:
- 使用颜色映射表(colormap)存储颜色。
- 图像是二维矩阵,颜色映射表为单独的 m×3 矩阵。
- RGB 图像:
- 像素的颜色值直接存储为 RGB 三元组。
- MATLAB 中 RGB 图像是三维数组(m×n×3)。
6.2 数据类型及描述
- MATLAB 提供多种数据类型,每种类型的存储需求和取值范围各不相同:
- 浮点类型:
double
:双精度浮点,范围极广(至
),每元素占 8 字节。
single
:单精度浮点,范围较小(至
),每元素占 4 字节。
- 整数类型:
- 无符号整数:如
uint8
(0-255)占 1 字节,uint16
(0-65535)占 2 字节。 - 有符号整数:如
int8
(-128 至 127),int16
(-32768 至 32767)。
- 无符号整数:如
- 字符与逻辑类型:
char
:存储字符,占 2 字节。logical
:存储布尔值,仅取0
或1
。
- 浮点类型:
这些类型的选择对图像存储、内存效率和处理速度有显著影响。
6.3 数据类型与图像类型的关系
- 图像的不同类型通过这些数据类型表示:
- 灰度图像(Intensity Image):
- 使用
uint8
或double
数据类型表示。 - 灰度范围根据类型不同而变化:
uint8
为 [0, 255],double
为 [0, 1]。
- 使用
- 二值图像(Binary Image):
- 采用
logical
类型,仅存储0
和1
。
- 采用
- 索引图像(Indexed Image):
- 使用二维矩阵表示像素值,通过查找颜色映射表(colormap)获取颜色。
- RGB 图像:
- 三维矩阵表示,分别存储 R、G、B 三个颜色通道。
- 灰度图像(Intensity Image):
6.4 数据类型之间的转换
MATLAB 提供灵活的类型转换函数,特别是针对图像数据的处理:
- 直接转换:
- 语法:
B = data_class_name(A)
,如B = double(A)
将uint8
数据转换为浮点类型。
- 语法:
- 图像工具箱函数(IPT):
im2uint8
:将输入转换为uint8
类型。im2double
:将输入缩放到 [0, 1] 范围的double
类型。mat2gray
:用于归一化图像,按范围 [Amin, Amax] 缩放到 [0, 1]。
f = [-0.5, 0.5; 0.75, 1.5]; % double 类型数据
G = im2uint8(f); % 转换为 uint8
% G = [0, 128; 191, 255]
6.5 类型转换的注意事项
- 范围问题:
- 转换为整数类型时,超出范围的值会被截断。
- 转换为逻辑类型时,非零值变为
1
,零值为0
。
- 精度问题:
- 由浮点类型转为整数类型会丢失小数部分。
6.6 MATLAB 图像类型转换示例
灰度归一化: 使用 mat2gray
将图像矩阵标准化到 [0, 1]。未指定范围时,MATLAB 会自动按 A
的最小值和最大值进行归一化。
A = [128, 300; -12, 66.98];
G = mat2gray(A, [0, 255]);
% G = [0.5020, 1; 0, 0.2627]
转换为二值图像: 使用逻辑运算将灰度图像转换为二值图像。
bw = A > 100; % 大于 100 的像素值为 1,其余为 0
- 数据类型的灵活使用是 MATLAB 图像处理的核心。选择合适的数据类型可以提升存储效率、计算速度,并避免精度丢失。
- MATLAB 提供了丰富的函数支持类型之间的转换和归一化,适应多样化的图像处理需求。
- 熟练掌握
im2uint8
、mat2gray
等函数,能在图像预处理阶段快速完成数据准备。
二、matlab语法
7、MATLAB 索引系统
MATLAB 的索引系统提供了灵活和强大的功能来操作数组和矩阵:
7.1 向量索引
- MATLAB 将一维数组视为行向量或列向量:
v = [1 2 3 4]; % 行向量 w = v'; % 转置为列向量
- 常用操作:
v(1:end)
:从第一个到最后一个元素。zeros(1, 4)
:生成一个 1×4 的零向量。
7.2 矩阵索引
- 矩阵可以通过多种方式初始化和操作:
A = [1 2 3; 4 5 6]; % 初始化 A(1, 2) % 访问第 1 行第 2 列 A(:, 2:4) % 提取第 2 到 4 列
- 特别操作:
sum(A)
返回每列的和。sum(A(:))
将矩阵展平后求总和。
7.3 调整矩阵形状的函数
reshape
:调整矩阵形状,例如将 3×4 的矩阵重塑为 2×6:A = [1 4 7 10; 2 5 8 11; 3 6 9 12]; B = reshape(A, 2, 6);
8、MATLAB 的运算与操作
8.1 算术运算
MATLAB 提供了 矩阵运算 和 数组运算,两者区别主要体现在操作对象上:
- 矩阵运算(线性代数):
*
:矩阵乘法,例如A * B
。/
或\
:矩阵左除和右除。
- 数组运算(逐元素操作):
.*
:逐元素乘法。.^
:逐元素幂。
8.2 图像运算
- MATLAB 提供专门的图像运算函数:
imadd
:图像加法。imsubtract
:图像减法。imdivide
:图像除法。immultiply
:图像逐元素乘法。
- 示例:
C = imadd(A, B); % 两个图像的逐元素加法
9、MATLAB 的逻辑运算与关系运算
9.1 逻辑运算符
- MATLAB 提供以下逻辑运算符:
&
:与运算(AND)。|
:或运算(OR)。~
:非运算(NOT)。
- 示例:
result = (A > 10) & (A < 20); % 检查 A 的元素是否在 10 到 20 之间
9.2 关系运算符
- 关系运算符可用于数组元素的比较:
<
、<=
、>
、>=
、==
、~=
。
- 示例:
is_equal = (A == B); % 判断两个数组是否对应相等
9.3 常用逻辑函数
xor(A, B)
:异或运算。all(A)
:检查所有元素是否为非零。any(A)
:检查是否存在非零元素。
10、MATLAB 判断与条件检查函数
MATLAB 提供了一系列 条件检查函数,返回逻辑值以判断条件是否成立:
iscell(C)
:判断 C 是否为单元数组。isempty(A)
:判断 A 是否为空。isnumeric(A)
:判断 A 是否为数值数组。isnan(A)
:检查 A 中的 NaN 元素位置。
示例:
if isempty(A)
disp('Matrix is empty.');
end
11、MATLAB 常量与系统变量
MATLAB 包含一些常见的变量和常量:
- 常量:
pi
:圆周率,值为 3.1416 。eps
:浮点相对精度。NaN
:表示无效数字。
- 系统变量:
computer
:当前计算机信息。version
:MATLAB 版本信息。
12、流程控制(Flow Control)
MATLAB 提供强大的流程控制工具,用于实现条件分支和循环操作:
12.1 条件语句
- if-else 语句:基于逻辑条件执行不同代码块。
if x > 0 disp('Positive'); elseif x < 0 disp('Negative'); else disp('Zero'); end
12.2 循环语句
- for 循环:指定次数的循环。
for i = 1:10 disp(i); end
- while 循环:基于逻辑条件持续执行。
while x < 10 x = x + 1; end
12.3 控制语句
break
:终止循环。continue
:跳过当前循环迭代。
12.4 switch-case
- 类似于其他编程语言的 switch 语句:
switch day case 'Monday' disp('Start of the week'); case 'Friday' disp('End of the week'); otherwise disp('Midweek'); end
12.5 错误处理
try-catch
:用于捕获和处理运行时错误。try result = riskyFunction(); catch ME disp('Error occurred'); disp(ME.message); end
13、代码优化(Code Optimization)
13.1 向量化循环(Vectorizing Loops)
- MATLAB 的核心优势在于向量和矩阵运算,用向量化替代循环操作可以显著提高性能。
% 循环版 for x = 1:M f(x) = A * sin((x - 1) / (2 * pi)); end % 向量化版 x = 0:M-1; f = A * sin(x / (2 * pi));
- 使用
meshgrid
处理二维函数:[C, R] = meshgrid(c, r); H = R.^2 + C.^2;
13.2 预分配数组(Preallocating Arrays)
- 动态分配大数组可能导致内存碎片化,预分配数组可显著提高性能:
f = zeros(1024); g = zeros(1024);
14、输入与输出(Interactive I/O)
MATLAB 提供了多种交互方式来实现输入输出功能:
14.1 输出函数
disp(argument)
:显示内容,可以是数组或字符串。disp('Hello MATLAB');
14.2 输入函数
input('message')
:获取用户输入,返回值根据输入类型自动判断。x = input('Enter a number: ');
14.3 字符串处理
- 使用
stread
和strcmp
进行字符串解析和比较:t = '12.6, x2y, z'; [a, b, c] = stread(t, '%f%s%s', 'delimiter', ',');
15、数据结构
MATLAB 提供两种主要数据结构来组织复杂数据:
15.1 单元数组(Cell Arrays)
- 可存储不同类型的数据:
C = {'text', [1 2 3], 42};
15.2 结构体(Structures)
- 类似于字典,允许存储键值对:
S.name = 'MATLAB'; S.version = '2023a';