我最近的任务是在自己的图像上使用一阶导数滤镜。教练说我应该首先修复y的值并在行上预先形成f(x + 1) - f(x),然后修复新的“X”值并预成型f(y + 1)-f(y)在列上。
注意:我被要求手动执行此任务,而不是使用filter2()或任何其他编程功能,因此请不要建议我使用filter2()或类似功能。谢谢!
我尝试调用所有像素并通过执行
减去每个像素fid = fopen('image.raw')
myimage = fread(fid,[512 683], '*int8')
fclose(fid)
imsz = size(myimage)
x = imsz(1)
for I = 1:512
for J = 1:683
X(I) - X(I-1) = XX
但它似乎没有用,我不明白为什么。如果你能帮助我,或指出我正确的方向,我会非常感激。
答案 0 :(得分:5)
首先,您的代码在语法上是不正确的:
end
语句,此外,您甚至不需要循环。myimage
,但在尝试计算衍生产品时,您正在使用未定义的变量X
。我强烈建议您在完成更复杂的任务之前阅读在线教程并熟悉MATLAB基础知识。
关于你的具体问题:
MATLAB鼓励对整个数组(向量或矩阵)进行矢量化操作,即操作。要减去数组中的相邻值,您基本上要做的是减去两个数组,相对于彼此移动一个元素。对于一维数组,可以在MATLAB中转换为:
a(2:end) - a(1:end-1)
其中a
是您的数组。 end
关键字指定数组中的最后一个索引。
要计算图像的导数(二维矩阵),您需要确定要执行该操作的轴。要沿y轴近似推导,请执行以下操作:
X(2:end, :) - X(1:end-1, :)
您可以验证这会为您提供与diff(X, 1)
(或简称diff(X)
)相同的结果。要计算沿x轴的近似导数(相当于diff(X, 2)
),请执行以下操作:
X(:, 2:end) - X(:, 1:end-1)
冒号(:
)与将1:end
写为相应维度的数组下标相同。
答案 1 :(得分:1)
如果您的过滤图片为div
,那么
for Y = 1:682
for X = 1:511
div(X, Y) = myimage(X + 1, Y + 1) - myimage(X,Y);
end
end
请记住最后一行和最后一列未过滤!