2012-05-30 57 views
1

我是matlab新手。我读了42×25阶的图像。我沿着该图像的x轴和y轴取得了导数。 当我沿X轴的衍生物,图像的顺序变成42 X 24,当我沿着Y轴变成41 X 25.在matlab中添加两个不同顺序的矩阵

现在我想要添加这两个矩阵。但他们的命令不同,所以我不能。但是,如果我沿着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 

所以好心帮我在做这两个矩阵的顺序。在此先感谢

+0

查看[这个问题](http://stackoverflow.com/questions/5190411/zero-padding-in-matlab)几种解决方案。 – Junuxx

回答

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

1

使用diff计算衍生物是有用的,但你必须了解它:diff本质上计算正向有限差分;因此你只能从N得到N-1的衍生值。

可以用零填充解决它(这螺丝了您的边缘)

OR

用于分的范围的中间

使用中央有限差分和向前/上边缘为点向后有限差。

更多信息: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 
0

我写的函数diffs来解决正是这个问题。它执行与diff相同的操作,但它用NaN填充输出,以便它与输入大小相同。如果您不想在输出中输入NaN,则可以用zeros的电话代替呼叫NaN

请注意,这不适用于更高维度的阵列(即尺寸大于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 

您现在可以使用你的原代码,与以diffs调用替换调用diff

0

是的,这很烦人。

  • 建议您可以使用零填充 - 但我会使用3点导数。

  • 或者你也可以插值,因为我会在数字之间找到1/2的衍生物,所以它应该很容易编写interp2命令。您需要决定是否要推断边界 - 或者放弃边界。