2

A という名前の m 行 n 列の行列があり、値は 1 と 0 です。8 つの隣接ピクセルのうち少なくとも 5 つが 1 の場合、すべての 0 の値を 1 に変換したいと考えています。私が試したのはnlfilter関数を使用することですが、引数のfun使用方法がわかりません。助けが必要です。nlfilter次のようにハンドルとして関数を作成しました。

function b = gap_fill(A)
b=A;
index= A([1 2 3 4 6 7 8 9]);
if sum(index)>=5
b(5)= 1
end
end

それから私はこれをやろうとしました:

B= nlfilter(A,[3 3],@gap_fill)

しかし、それはこのエラーを出しました:

??? Subscripted assignment dimension mismatch.

Error in ==> nlfilter at 75
    b(i,j) = feval(fun,x,params{:});

なにか提案を?主な問題は、関数の処理に慣れていないことです。

= 更新中 =

やっと良い結果にたどり着きました。関数を変更してスカラーを出力し、それをfun引数として使用すると、希望どおりに機能しますnlfilter。これは私のコードです。助けてくれてありがとう。誰にとっても役立つことを願っています:

function b = gap_fill(A)
index= A([1 2 3 4 6 7 8 9]);
if sum(index)>=5
A(5)= 1;
end
b=A(5);
end

MATLAB では:

b= nlfilter (A,[3 3],'gap_fill')
4

4 に答える 4

3

次のように 1 行で実行できますblockproc

B = blockproc(A,[1 1],@(x)sum(x.data(:)),'BorderSize',[1 1],'TrimBorder',0)-A>=5;

例えば、

A =

     1     0     1     1     0
     0     0     0     1     1
     1     1     1     1     1
     0     1     0     1     1

結果を与える

B =

     0     0     0     0     0
     0     1     1     1     0
     0     0     1     1     1
     0     0     1     0     0

'BorderSize'のオプションを使用したおかげで、画像の境界ピクセルが正しく処理されていることに注意してくださいblockproc

元のものを に保持するにはA、最後の「または」操作を適用します。

B = B|A;
于 2014-01-27T17:52:51.043 に答える
2

nlfilterユーザー関数はスカラーを返す必要があり、行列を返そうとしていると書かれているためだと思います。

B = nlfilter(A, [m n], fun) applies the function fun to each m-by-n sliding block 
of the grayscale image A. fun is a function that accepts an m-by-n matrix as input
and returns a scalar (!!!) result.
于 2014-01-27T17:44:40.043 に答える