First Derivative过滤器Matlab

时间:2013-06-17 14:17:52

标签: matlab

我最近的任务是在自己的图像上使用一阶导数滤镜。教练说我应该首先修复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

但它似乎没有用,我不明白为什么。如果你能帮助我,或指出我正确的方向,我会非常感激。

2 个答案:

答案 0 :(得分:5)

首先,您的代码在语法上是不正确的:

  1. 您的任何循环都没有end语句,此外,您甚至不需要循环。
  2. 您似乎将图片读入变量myimage,但在尝试计算衍生产品时,您正在使用未定义的变量X
  3. 您的作业声明的顺序相反。您要分配的变量应写在分配的左侧部分。
  4. 我强烈建议您在完成更复杂的任务之前阅读在线教程并熟悉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

请记住最后一行和最后一列未过滤!