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 では、ベクトル化された操作、つまり、配列全体 (ベクトルまたは行列) に対する一度の操作が推奨されます。配列内の隣接する値を減算するには、基本的に 2 つの配列を減算し、互いに 1 要素ずらします。1 次元配列の場合、MATLAB では次のように変換されます。

a(2:end) - a(1:end-1)

あなたの配列はどこaですか。キーワードは、配列内のend最後のインデックスを指定します。

イメージ (2 次元行列) の導関数を計算するには、その操作をどの軸に沿って実行するかを決定する必要があります。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 に答える