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)    
   [a,b]=hist(x(:),unique(x));
   [c ret]=max(a)

该变量ret现在将携带过滤器选择的 nxm 块中重复次数最多的元素的值。

于 2013-05-15T16:38:58.297 回答
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

下面的代码将完全满足您的需求。

空间值.m

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

主文件

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

来自 MatLab (R2011b) 文档:

B = nlfilter(A, [m n], fun)将函数 fun 应用于灰度图像的每个 m×n 滑动块Afun是一个接受 m×n 矩阵作为输入并返回标量(!!!) 结果的函数。

您的函数返回 8x8 矩阵,而不是标量。

于 2013-05-15T16:41:45.223 回答
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 回答