0

私は、8x8の近隣でより繰り返されるその値を、その近隣のすべてのピクセルの値に割り当てようとしています。

次の関数を呼び出しました。

   function ret = spatial_val(x)
       [m,n]=size(x);
       [a,b]=hist(x(:),unique(x));
       most_frequent_value=mode(x(:));
       for i=1:m
           for j=1:n
               x(i,j)=most_frequent_value;
               ret(i,j)=x(i,j);
           end
       end
   end

使用:

new_img = nlfilter(img, [8,8], @spatial_val);  

しかし、次のエラーが表示されます。

Subscripted assignment dimension mismatch.

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

Error in Fuzzy_CMeans_ali (line 186)
    new_img = nlfilter(img, [8,8], @spatial_val);

この問題を解決するにはどうすればよいですか?

4

4 に答える 4

1

あなたがやろうとしていたことは次のとおりだと思います:

function ret = spatial_val(x)
    ret = ones(size(x))*mode(x(:));
end

編集 - 1

必要なのは実際には次のとおりです。

function ret = spatial_val(x)
    ret = uint8(mode(double(x(:))));
end

その後:

B = nlfilter(lena,[8 8],@spatial_val);
imshow(B);

編集 - 2

以下のコードは、必要なことを正確に実行します。

spatial_val.m

function ret = spatial_val(x)
    ret = uint8(ones(size(x))*mode(double(x(:))));
end

main.m

clear;
close;
clc;

lena = imread('lena.jpg');

[m, n] = size(lena);
result = uint8(zeros([m, n]));

window_size = [8, 8];

for ii=1:window_size(1):m
    for jj=1:window_size(2):n
        result(ii:min(ii+window_size(1),m),jj:min(jj+window_size(2),n)) = spatial_val(lena(ii:min(ii+window_size(1),m),jj:min(jj+window_size(2),n)));
    end
end

subplot(1,2,1);
imshow(lena);
subplot(1,2,2);
imshow(result);

これは与える:

ここに画像の説明を入力

于 2013-05-15T16:41:09.717 に答える
0

これはどう:

im = imread('cameraman.tif');
imp = blockproc(im,[8 8],@(bs) mode(bs.data(:))*ones(size(bs.data),'like',bs.data));
imshow(imp)
于 2013-05-16T17:58:28.047 に答える