为邻居分配相同的值

时间:2013-05-15 16:14:00

标签: matlab neighbours

我正在尝试将在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 个答案:

答案 0 :(得分:1)

你需要你的功能来提供单个值而不是矩阵。如果你有两个或更多的数字出现频率相同的次数,那么也不清楚什么是默认值。暂时忽略这种情况,您可以按如下方式简化您的功能:

function ret = spatial_val(x)    
   [a,b]=hist(x(:),unique(x));
   [c ret]=max(a)

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

答案 1 :(得分: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);

这给出了:

enter image description here

答案 2 :(得分:0)

来自MatLab(R2011b)文档:

  

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

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

答案 3 :(得分:0)

这个怎么样:

im = imread('cameraman.tif');
imp = blockproc(im,[8 8],@(bs) mode(bs.data(:))*ones(size(bs.data),'like',bs.data));
imshow(imp)