用MATLAB进行图像处理

图像处理概念,算法和MATLAB

少用网格和repmat

的函数 meshgrid 而且 repmat 在MATLAB中有着悠久而丰富的历史。今天,我将试着说服你少用它们。

meshgrid

这个函数 meshgrid 通常用于取x坐标的向量和y坐标的向量并将它们转化为两个矩阵, X 而且 Y ,可以用来计算两个变量的函数。这里有一个小例子。
X = [0 1 2];
Y = [0 10 20 30];
[X,Y] = meshgrid(X,Y)
X = 4×3
0 1 2 0 1 2 0 1 2 0 1 2
Y = 4×3
0 0 0 10 10 10 20 20 30 30 30
下面的另一个例子说明了如何做到这一点 meshgrid 通常使用。例子,摘自第2版(2009) 数字图像处理MATLAB, 构造函数的曲面图 $ f(x,y) = xe^{-(x²+ y²)}$
X = -2:0.1:2;
Y = -2:0.1:2;
[X,Y] = meshgrid(X,Y);
Z = X *exp(-(X。²+ y .²));
冲浪(Z)
的变量 x 而且 y 是向量,还是变量 X 而且 Y 矩阵:
x y x y
名称大小字节类属性X 41x41 13448 double Y 41x41 13448 double X 1x41 328 double Y 1x41 328 double
这个函数 meshgrid 已用于构造相同大小的矩阵,以便它们可以在表示两个空间坐标的矩阵上的各种元素算术运算中组合在一起。

repmat

函数名 repmat 是“复制矩阵”的缩写。一种常见的用法 repmat 将一个矢量复制成一个矩阵的大小,或将一个矩阵复制成一个三维数组的大小。一个经典的例子是从矩阵中减去列均值:
A = rand(4)
一个= 4×4
0.8147 0.6324 0.9575 0.9572 0.9058 0.0975 0.9649 0.4854 0.1270 0.2785 0.1576 0.8003 0.9134 0.5469 0.9706 0.1419
col_means = mean(A,1)
col_means = 1×4
0.6902 0.3888 0.7627 0.5962
B = repmat(col_means,size(A,1),1)
B = 4×4
0.6902 0.3888 0.7627 0.5962 0.902 0.3888 0.7627 0.5962 0.5962
C = a - b
C = 4×4
0.1245 0.2435 0.1949 0.3610 0.2156 -0.2913 0.2022 -0.1108 -0.5632 -0.1103 -0.6050 0.2041 0.2232 0.1581 0.2079 -0.4543

MATLAB算术运算符变更五周年

五年前,随着MATLAB的R2016b发布,一些MATLAB算子和函数以一种被广泛使用的方式进行了广义化 meshgrid 而且 repmat 不再需要了。有了这个版本,诸如 + 而且 - 取两个操作数可以自动处理不同大小的操作数,只要大小差异采用特定的形式。在上面的例子中, 一个 有4x4码的,还有 col_means 大小为1x4。在R2016b发布之前,表达式 A - col_means 会产生一个错误,因为大小不匹配。但是,从R2016b开始,当一个或另一个操作数的维数在不匹配的维数中为1时,算术操作符(以及一些其他操作符和函数)可以自动匹配不同的大小。
这意味着你不再需要打电话 repmat 从矩阵中减去列意味着。你可以用 - 接线员:
C = A - mean(A,1)
C = 4×4
0.1245 0.2435 0.1949 0.3610 0.2156 -0.2913 0.2022 -0.1108 -0.5632 -0.1103 -0.6050 0.2041 0.2232 0.1581 0.2079 -0.4543
此外,您通常不再需要使用 meshgrid 如上所示,计算两个变量的函数。前面例子中的代码现在可以写成:
X = -2:0.1:2;
Y = (-2:0.1:2)';
Z = x.*exp(-(x。²+ y.²));
冲浪(Z)
第3版(2020年) 利用MATLAB进行数字图像处理 作了相应的修订。

更多信息

有关此更改的细节和历史的更多信息,我推荐以下来源。其中前三个出现在Loren Shure的MATLAB艺术博客上;前两集是我客串写的。最后一个来源是MATLAB文档页面。

再举两个例子

2011年,我写道 一些博客文章 关于生成一个测试图像,有人称之为 波带片 .我也把相关的代码放在File Exchange上作为函数 imzoneplate .以下是原始实现的关键数学部分:
[x,y] = meshgrid(x1:x2);
R = hypot(x,y);
Km = 0.7*pi;
Rm = x2;
W = rm/10;
Term1 = sin((km * r.^2) / (2 * rm);
Term2 = 0.5*tanh((rm - r)/w) + 0.5;
G = term1 .* term2;
I = (g + 1)/2;
函数的 函数现在支持隐式展开,因此调用金宝app meshgrid 没有必要。前几行可以重写为:
X = x1:x2;
Y = x';
R = hypot(x,y);
第二版 利用MATLAB进行数字图像处理 包含一个代码片段,用于计算pxn矩阵的每一行之间的欧氏距离 X 和一个1xn向量 y
D =平方根(sum(abs(X - repmat(y,p,1)).^2,2));
现在可以不调用 repmat
D =平方根(sum(abs(X - y).^2,2));
所以,下次你发现自己伸手的时候 meshgrid repmat ——也许你不需要它!
|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。