我是matlab的新手。我读了一张42×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
请帮助我制作这两个矩阵的顺序。提前谢谢
答案 0 :(得分:1)
使用diff
来计算导数是有用的,但你必须理解它:diff
基本上计算前向有限差分;因此,仅从N-1
点获得N
衍生值是有道理的。
您可以使用零填充(将边缘拧紧)来解决它
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
答案 1 :(得分: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
现在,您可以使用原始代码,通过拨打diff
来取代diffs
来电。
答案 2 :(得分:0)
是的,这很烦人。
根据建议您可以使用零填充 - 但我会使用3点派生。
或者你可以进行插值,因为我会在数字之间的1/2处找到导数,应该很容易编写interp2
命令。你需要决定是否要推断边界 - 或者只是留下它。
答案 3 :(得分: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
。