【图像处理lec2】matlab的使用

时间:2024-12-14 16:07:48

目录

一、图像相关操作

1、数字图像的表示

2、读取图像

3、获取图像信息

4、显示图像的函数

5、保存图像的函数

6、数据类型及图像类型

6.1 图像类型

6.2 数据类型及描述

6.3 数据类型与图像类型的关系

6.4 数据类型之间的转换

6.5 类型转换的注意事项

6.6 MATLAB 图像类型转换示例

二、matlab语法

7、MATLAB 索引系统

7.1 向量索引

7.2 矩阵索引

7.3 调整矩阵形状的函数

8、MATLAB 的运算与操作

8.1 算术运算

8.2 图像运算

9、MATLAB 的逻辑运算与关系运算

9.1 逻辑运算符

9.2 关系运算符

9.3 常用逻辑函数

10、MATLAB 判断与条件检查函数

11、MATLAB 常量与系统变量

12、流程控制(Flow Control)

12.1 条件语句

12.2 循环语句

12.3 控制语句

12.4 switch-case

12.5 错误处理

13、代码优化(Code Optimization)

13.1 向量化循环(Vectorizing Loops)

13.2 预分配数组(Preallocating Arrays)

14、输入与输出(Interactive I/O)

14.1 输出函数

14.2 输入函数

14.3 字符串处理

15、数据结构

15.1 单元数组(Cell Arrays)

15.2 结构体(Structures)


一、图像相关操作

1、数字图像的表示

  • 坐标约定
    • 数字图像用二维矩阵表示,像素坐标以 (x, y) 表示。
  • 矩阵表示
    • 图像的每个像素对应矩阵中的一个元素,值代表灰度或颜色强度。
    • 在 MATLAB 中,矩阵索引从 1 开始,与传统的从 0 开始的数组有所不同。

2、读取图像

  • 支持的图像格式
    • 常见格式包括 TIFF、JPEG、GIF、BMP、PNG、XWD 等。
  • 读取方法
    • 使用 MATLAB 的 imread 函数,例如 f=imread('bird.jpg');
    • 注意:
      1. 文件需位于当前目录或搜索路径中。
      2. 忽略分号会直接显示图像矩阵的值。

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:双精度浮点,范围极广(10^{-308}10^{308}),每元素占 8 字节。
      • single:单精度浮点,范围较小(10^{-38}10^{38}),每元素占 4 字节。
    • 整数类型
      • 无符号整数:如 uint8(0-255)占 1 字节,uint16(0-65535)占 2 字节。
      • 有符号整数:如 int8(-128 至 127),int16(-32768 至 32767)。
    • 字符与逻辑类型
      • char:存储字符,占 2 字节。
      • logical:存储布尔值,仅取 01

这些类型的选择对图像存储、内存效率和处理速度有显著影响。

6.3 数据类型与图像类型的关系

  • 图像的不同类型通过这些数据类型表示:
    • 灰度图像(Intensity Image)
      • 使用 uint8double 数据类型表示。
      • 灰度范围根据类型不同而变化:uint8 为 [0, 255],double 为 [0, 1]。
    • 二值图像(Binary Image)
      • 采用 logical 类型,仅存储 01
    • 索引图像(Indexed Image)
      • 使用二维矩阵表示像素值,通过查找颜色映射表(colormap)获取颜色。
    • RGB 图像
      • 三维矩阵表示,分别存储 R、G、B 三个颜色通道。

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 提供了丰富的函数支持类型之间的转换和归一化,适应多样化的图像处理需求。
  • 熟练掌握 im2uint8mat2gray 等函数,能在图像预处理阶段快速完成数据准备。

二、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 字符串处理

  • 使用 streadstrcmp 进行字符串解析和比较:
    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';