基本原理

《数字图像处理》 – 冈萨雷斯 读书笔记

数字图像的表示

​ 坐标约定:

  • 多数图像处理书籍中所用的坐标约定
  • 图形处理工具箱中所用的坐标约定

图像的矩阵表示

读取图像

>> f = imread(filename);

​ filename 是一个含有图像文件全名的字符串,此处可以用相对路径和绝对路径

>>size(f)

​ 函数size可以给出一幅图像的行数和列数

>> whos f

1
函数whos可以显示出一个数组的附加信息

显示图像

>> imshow(f,G)

​ f是一个图像数组,G是显示该图像的灰度级数(若G省略,则默认的灰度级数是256)

​ 其他表示法:

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

>> imshow(f,[ ])

​ 同时显示两个图像

>> imshow(f), figure, imshow(g)

保存图像

>> imwrite(f,'filename')

>> imwrite(f,'firstImage','tif')

​ 或

>> imwrite(f,'firstImage.tif')

使用imfinfo保存图像

>> imfinfo filename

​ 执行完此命令后会输出该图片的相关信息,可通过相关信息了解该图片相关属 性

imwrite的另一种常用但只适用于tif图像的语法

imwrite(g,'filename.tif','compression','parameter','resolution',[colres rowres])

利用print保存图像可以获得更多的输出参数

print -fno -dfileformat -rreson filename

图像类和类型间的转换

im2uint8

img

​ 函数im2uint8将输入中所有小于0 的值设置为0 ,所有大于1 的值设置为 255 再将所有的数都乘255,并将结果四舍五入为最接近的整数后,就完成了转换。

im2double

数组索引

​ 作用:简化了数组操作,而且提高了程序的运行效率。

向量索引

  • 向量的第一个元素下标为1

  • .' 行向量转换为列向量

  • 函数 linkspace

    x = linspace(a, b, n)

矩阵索引

  • 矩阵中分号的作用,与前面提到的取消命令的输出或在一行中写入多条命令时所用分号的作用是不同的
  • 矩阵中最后一个元素的索引可用 end 来代替

img

​ 其中E显示了A中行1列2,行3列2,行1列3,行3列3对应的值

  • 使用数组索引对图像进行简单的操作

    翻转

    此处遇到的问题:

    img

    当用此图片进行翻转时,出现如下状况:

img

​ 经过检验发现 size(f) 有三个参数,上网查询知道是由于原图片为彩色图像,改为黑白图像即可

原图像

原图像

翻转后的图像

翻转后的图像

部分图像

部分图像

一些重要的标准数组

  • zeros(M,N)
  • ones(M,N)
  • true(M,N)
  • false(M,N)
  • magic(M)
  • rand(M,N)
  • randn(M,N)

M函数编程简介

M文件组成部分

  • 函数定义行
  • H1行
  • 帮助文本
  • 函数体
  • 命令

    函数行:

​ 函数定义行的形式为:function [outputs] = name(inputs)

输入必须在()内,输出必须在[ ]内,但是如果输出只有一个变量则可以 省略[ ]

​ H1行:

​ 该行提供了关于M文件的重要摘要信息

​ 帮助文本:

​ 跟在H1行后面的文本块,为函数提供注释或在线帮助。

​ 函数体:

​ 包含了所有执行计算并给输出变量赋值的MATLAB代码。

​ 例如执行sumprod.m文件

>> edit sumprod

运算符

  • 执行数值计算的算术运算符
  • 在数量上比较操作数的关系运算符
  • 执行韩式AND、OR和NOT的逻辑运算符

improd.m文件

1
2
3
4
5
6
7
function [p, pmax, pmin, pn] = improd(f, g)
fd = double(f);
gd = double(g);
p = fd.*gd;
pmax = max(p(:));
pmin = min(p(:));
pn = mat2gray(p);

一些重要的变量和常数

函数 返回值
ans 最新的答案
eps 浮点数的相对精度
i(或j) 虚数单位
NaN或nan Not-a-Number
pi 3.14159265358979
realmax 计算机所能表示的最大浮点数
realmin 计算机所能表示的最小浮点数
version

流控制

​ if、else、for 、 while、 break、continue…

average.m文件

1
2
3
4
5
function av = average(A)
if ndims(A) > 2
error('The dimensions of the input cannot exceed 2.')
end
av = sum(A(:))/length(A(:));

​ 将例2.12中的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for r = rx:rowhogh
xcount = xcount + 1;
ycount = 0;
for c = cy:colhigh
ycount = ycount + 1;
s(xcount,ycount) = f(r, c);
end
end

​ for改成while

1
2
3
4
5
6
7
8
9
10
11
12
r = rx;
while r~=rowhigh
r = r + 1;
xcount = xcount + 1;
ycount = 0;
c = cy;
while c~=colhigh
c = c + 1;
ycount = ycount + 1;
s(xcount,ycount) = f(r, c);
end
end

####

代码优化

twodsin.m文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function [rt, f, g] = twodsin(A, u0, v0, M, N)
tic
for r = 1:M
u0x = u0 * (r - 1);
for c = 1:N
v0y = v0 * (c - 1);
f(r, c) = A * sin(u0x + v0y);
end
end
t1 = toc;
tic
r = 0:M - 1;
c = 0:N - 1;
[C, R] = meshgrid(c, r);
g = A * sin(u0 * R + v0 * C);
t2 = toc;
rt = t1/(t2 + eps); % Use eps in case t2 is close to 0

交互式I/O

单元数组与结构简介