我正在尝试将在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);
我该如何解决这个问题?
答案 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
事实上你所需要的只是:
function ret = spatial_val(x)
ret = uint8(mode(double(x(:))));
end
然后:
B = nlfilter(lena,[8 8],@spatial_val);
imshow(B);
以下代码将完全符合您的需求。
<强> 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);
这给出了:
答案 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)