1

私はmatlabが初めてです。オーダー 42 X 25 の画像を読み取りました。その画像の x 軸と y 軸に沿って導関数を取りました。X軸に沿って導関数を取ると、画像の順序は42 X 24になり、Y軸に沿って取ると41 X 25になります.

ここで、これら 2 つの行列を追加します。しかし、それらは異なる順序であるため、できません。しかし、x 軸に沿って画像の導関数にゼロの列を追加し、y 軸に沿って画像の導関数にゼロの行を追加するとします。このことは、同じ順序の行列を作成できます。

I = imread('abc.jpg');

BW=im2bw(I,graythresh(I));

I_derived_x = diff(BW, 1, 2);
I_derived_y = diff(BW, 1, 1);

今、私はやりたい

SUM = I_derived_x + I_derived_y 

これら2つの行列の順序を立てるのを手伝ってください。前もって感謝します

4

4 に答える 4

1

導関数の計算に使用diffすると便利ですが、理解する必要があります。diff基本的に、前方有限差分を計算します。N-1したがって、ポイントから微分値のみを取得することは理にかなっていますN

あなたはゼロパディング(あなたのエッジを台無しにする)でそれを解決することができます

また

範囲の中央のポイントには中央の有限差分を使用し、エッジのポイントには前方/後方の有限差分を使用します。

詳細: http: //en.wikipedia.org/wiki/Finite_difference

編集:あなたの場合、これは次のように解決されます:

I_derived_x = 0.5*[BW(:,2)-BW(:,1)  ,  0.5*(BW(:,3:end)-BW(:,1:end-2))  ,  BW(:,2)-BW(:,1)];
I_derived_y = 0.5*[BW(2,:)-BW(1,:)  ;  0.5*(BW(3:end,:)-BW(1:end-2,:))  ;  BW(2,:)-BW(1,:)];

これにより、と同じグリッド上の導関数が得られますBW。これにより、必要に応じてそれらの合計を簡単に取得できます

SUM = I_derived_x + I_derived_y
于 2012-05-30T08:20:36.550 に答える
0

diffsこの問題を正確に解決する関数を作成しました。と同じ操作を実行しますが、入力と同じサイズになるようdiffに出力をパディングします。出力したくない場合は、NaNへの呼び出しをへの呼び出しに置き換えることができます。NaNzerosNaN

これは、高次元の配列 (つまり、次元が 2 より大きい) では機能しないことに注意してください。

function d = diffs(x,n,dim)
%"DIFF Difference the columns/rows of a matrix and return a result the same"
%"size as the original"

    if nargin < 2
        n = 1;
    end
    if nargin < 3
        dim = 1;
    end

    if dim == 2
        x = transpose(x);
    end

    k = size(x,2);
    d = [NaN(n,k); diff(x,n)];

    if dim == 2
        d = transpose(d);
    end

end

diffへの呼び出しを への呼び出しに置き換えて、元のコードを使用できるようになりましたdiffs

于 2012-05-30T08:32:26.827 に答える
0

はい、それは迷惑です。

  • 提案されているように、ゼロパディングを使用できますが、3 点導関数を使用します。

  • または、コマンドを簡単に記述できるように、数値間の 1/2 で導関数を見つけるように補間することもできますinterp2。境界線を外挿するか、そのままにしておくかを決定する必要があります。

于 2012-05-30T08:32:42.673 に答える
0

Mathworksで調査することで、私が求めていた解決策を見つけました。これは、マトリックスにゼロの行/列を追加する方法です。

I_derived_x = padarray(I_derived_x,[0 1],0,'post'); 
I_derived_y = padarray(I_derived_y,[1 0],0,'post');

ここで、関数の最初の引数は行列です。2 番目の引数は、もう 1 つの列を追加し、I_derived_x行列に行を追加しないことを意味します。3 番目の引数は、私の場合のように、ゼロと最後の引数で埋めたい場合のように、それをどのように埋めたいかを意味します。新しく追加された行/列の方向を指定します。マトリックスの最後に必要なので、postここで使用しました。

于 2012-05-30T11:45:52.907 に答える