用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 20 30 30 30 30
这是另一个示例,说明了如何 meshgrid 通常是使用。这个例子,取自2009年的第二版 基于MATLAB的数字图像处理 构造函数的曲面图 $ f(x,y)= xe ^ { - (x ^ 2 + y ^ 2)} $
x = -2:0.1:2;
Y = -2:0.1:2;
[x,y] = meshgrid(x,y);
z = x. * exp( - (x. ^ 2 + y. ^ 2));
冲浪(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. 是将向量复制为矩阵的大小,或者将矩阵复制为3-D阵列的大小。经典示例是从矩阵中减去列均值:
兰德(4)=
一个= 4×4
0.8147 0.6324 0.9575 0.9572 0.9572 0.9058 0.0975 0.9649 0.4854 0.1270 0.2785 0.1270 0.2785 0.1576 0.8003 0.9134 0.5469 0.9706 0.1419
col_means =意味着(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.6902 0.3888 0.7627 0.5962 0.6902 0.3888 0.7627 0.5962 0.6902 0.3888 0.7627 0.5962 0.7627 0.5962 0.7627 0.5962 0.7627 0.5962 0.7627 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. 尺寸1 x4。在R2016b发布之前,该表达式 A - col_means 将产生一个错误,因为不匹配的大小。但是,从R2016b开始,当一个或另一个操作数的维数为1时,算术运算符(以及其他一些运算符和函数)可以自动匹配不同的大小。
这意味着您不再需要打电话 repmat. 从矩阵中减去列的意思。你可以用 - 操作员:
C = A -均值(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。^ 2 + y。^ 2));
冲浪(Z)
第三版(2020年) 使用MATLAB的数字图像处理 被评为相应。

想要查询更多的信息

有关此更改的详细信息和历史,我推荐这些资源。前三个出现在Loren Shure的Art of MATLAB博客上;前两篇是我写的。最后一个源代码是一个MATLAB文档页面。

另外两个例子

2011年,我写道 一些博客文章 关于生成一些呼叫的测试图像 区域板 .我还将相关代码放在文件交换中作为函数 indzoneplate. .以下是原始实现的关键数学部分:
(x, y) = meshgrid (x1, x2);
r =函数(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 =函数(x, y);
第2版 使用MATLAB的数字图像处理 包括用于计算PXN矩阵的每一行之间的欧几里德距离的代码片段 X 和一个1xn矢量 y
d = sqrt(sum(abs(x - repmat(y,p,1))。^ 2,2));
现在可以在没有呼叫的情况下写入 repmat.
d = sqrt(sum(abs(x - y)。^ 2,2));
所以,下次你发现自己到达 meshgrid repmat. ——也许你并不需要它!
|
  • 打印
  • 发送电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。