我尝试使用(i,j)
在每个像素位置计算和存储图像的每个像素▽xf(i,j) = f(i,j)- f(i, j-1)
的导数,我的问题是我在实现此问题时遇到了问题Matlab的。
我正在做的是加载图片,将其转换为无符号整数的两倍,用零初始化Dxf
,然后尝试为每个(i,j)
获取每个像素的导数:< / p>
InputImage = imread([DataDir,'kodim09gray.png']);
InputImage = double(InputImage);
[IHeight,IWidth] = size(InputImage);
Dxf = zeros(IHeight,IWidth);
for i = 1:IHeight
for j = 1:IWidth
Dxf(i,j) = InputImage(i,j) - InputImage(i,j-1);
end
end
不幸的是,我收到以下索引错误:
Attempted to access InputImage(1,0); index must be a positive integer or logical.
Error in GetXDerivative (line 13)
Dxf(i,j) = InputImage(i,j) - InputImage(i,j-1);
我可以看到导致问题的原因InputImage(1,0)
不存在,但我仍然无法想到如何在不破坏每个像素所需的计算的情况下解决这个问题。
答案 0 :(得分:1)
有很多方法可以做到这一点。这是两个:
n = size(InputImage,1);
%// Method 1
Dxf = [nan(n,1), diff(InputImage,1,2)]
%// Method 2
Dxf = [nan(n,1), conv2(InputImage,[1,-1],'valid')]
对代码的快速修复是在2
开始循环:
for j = 2:IWidth
但是你的第一列中有零,这是不正确的,因为它们应该是未定义的。
答案 1 :(得分:0)
您必须决定将衍生物放在图像边缘意味着什么。通常f'
只能在f
连续的位置定义。考虑f(x) = |x|
。 x=1
和x=-19584
处的衍生商已定义,但未定义x=0
。由于j=0
不存在,图像的边缘同样不连续。
我认为最好的选择是在{x}方向上使Dxf
更小,因此所有像素都有定义。同样,DDxf
的范围会更小。
或者,您可以确定Dxf(1,1)
应为白色或黑色。