0

我最近的任务是对自己的图像使用一阶导数过滤器。教练说我应该先固定 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

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

4

2 回答 2

5

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

  1. 您的任何循环都没有end声明,此外,您甚至不需要这里的循环。
  2. 您似乎已将图像读入变量,但在尝试计算导数时myimage使用了未定义的变量。X
  3. 你的赋值语句的顺序是相反的。您希望分配的变量应写在分配的左侧。

我强烈建议您在执行更复杂的任务之前阅读在线教程并熟悉 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对应维度的数组下标相同。

于 2013-06-17T14:41:13.927 回答
1

div如果您的过滤图像是

for Y = 1:682
    for X = 1:511
        div(X, Y) = myimage(X + 1, Y + 1) - myimage(X,Y);
    end
end

记住最后一行和最后一列没有被过滤!

于 2013-06-17T14:34:34.350 回答