1

我是matlab的新手。我读取了 42 X 25 阶的图像。我沿该图像的 x 轴和 y 轴求导。当我沿 x 轴求导时,图像的顺序变为 42 X 24,当我沿 Y 轴取时,图像的顺序变为 41 X 25。

现在我想添加这两个矩阵。但它们的顺序不同,所以我不能。但是,如果我在沿 x 轴的图像导数中附加零列,在沿 y 轴的图像导数中附加零行。这个东西可以制作相同顺序的矩阵。

I = imread('abc.jpg');

BW=im2bw(I,graythresh(I));

I_derived_x = diff(BW, 1, 2);
I_derived_y = diff(BW, 1, 1);

现在我想做

SUM = I_derived_x + I_derived_y 

所以请帮助我确定这两个矩阵的顺序。提前致谢

4

4 回答 4

1

用于计算导数很有用diff,但您必须理解它:diff本质上是计算前向有限差​​分;N-1因此,您只能从点中获得导数值是有道理的N

你可以用零填充来解决它(这会搞砸你的边缘)

或者

对范围中间的点使用中心有限差分,对边缘上的点使用前向/后向有限差分。

更多信息:http ://en.wikipedia.org/wiki/Finite_difference

编辑:在您的情况下,这将解决为:

I_derived_x = 0.5*[BW(:,2)-BW(:,1)  ,  0.5*(BW(:,3:end)-BW(:,1:end-2))  ,  BW(:,2)-BW(:,1)];
I_derived_y = 0.5*[BW(2,:)-BW(1,:)  ;  0.5*(BW(3:end,:)-BW(1:end-2,:))  ;  BW(2,:)-BW(1,:)];

它为您提供与 相同的网格上的导数BW。这很容易让您根据需要获取它们的总和

SUM = I_derived_x + I_derived_y
于 2012-05-30T08:20:36.550 回答
0

我编写了函数diffs来解决这个问题。它执行与 相同的操作diff,但它用 填充输出NaN,使其大小与输入相同。如果您不想在输出中出现,您可以将调用替换为调用NaNzerosNaN

请注意,这不适用于更高维度的数组(即维度大于 2)。

function d = diffs(x,n,dim)
%"DIFF Difference the columns/rows of a matrix and return a result the same"
%"size as the original"

    if nargin < 2
        n = 1;
    end
    if nargin < 3
        dim = 1;
    end

    if dim == 2
        x = transpose(x);
    end

    k = size(x,2);
    d = [NaN(n,k); diff(x,n)];

    if dim == 2
        d = transpose(d);
    end

end

您现在可以使用原始代码,将调用diff替换为调用diffs.

于 2012-05-30T08:32:26.827 回答
0

是的,这很烦人。

  • 正如建议的那样,您可以使用零填充 - 但我会使用 3 点导数。

  • interp2或者您可以插值,因为我会在数字之间的 1/2 处找到导数,编写命令应该很容易。您需要决定是否要推断边界 - 或者只是将其保留为 nan。

于 2012-05-30T08:32:42.673 回答
0

通过研究Mathworks,我找到了我正在寻找的解决方案。这是在矩阵中添加零行/列的方法。

I_derived_x = padarray(I_derived_x,[0 1],0,'post'); 
I_derived_y = padarray(I_derived_y,[1 0],0,'post');

在函数中,第一个参数是矩阵,第二个是顺序表示我想在矩阵中再添加一列并且没有行I_derived_x,第三个参数表示我想如何填充它,就像在我的情况下我希望它用零和最后一个参数填充指定新添加的行/列的方向,因为我想要它在矩阵的末尾,所以我post在这里使用。

于 2012-05-30T11:45:52.907 回答