我正在尝试使用colfilt
做一个自定义Matlab函数,其中如果像素的值是黑色或白色(0或255),则该值将是邻居的中间值。由于我正在使用colfilt
,所以这意味着邻居值出现在同一列中,因此我执行了以下功能:
function [Y] = Lab3_2(X)
n = X(5)
if(n ==255 || n ==0)
Y = median(X)
else
Y = n
end
end
然后调用该函数:
Y = uint8(colfilt(Isp,[3 3],'sliding',@Lab3_2))
Isp
是带有椒盐噪声的图像。
问题是我收到此错误:
使用重塑时出错要重塑形状,元素的数量不得更改。
colfilt中的错误(第182行) 重塑(feval(fun,x,params {:}),block(1),block(2));
我阅读了文档,并说该函数必须为临时矩阵中的每一列返回一个包含单个值的行向量。
我认为我没有正确执行此操作(我指的是输出变量Y),而且我不确定n = X(5)
行是否正确。
有人知道我该如何解决吗?
答案 0 :(得分:1)
如果您有一个循环遍历输入矩阵X
的每一列(或者,如果colfilt
逐一将这些列传递给函数),则您的方法将可行。要实现循环,您需要执行以下操作:
function [Y] = Lab3_2(X)
num_cols = size(X,2); % get number of columns in X
Y = zeros(1,num_cols); % preallocate row vector Y
for c = 1:size(X,2); % iterate over each column of X
Xcol = X(c);
n = Xcol(5) % check whether center pixel is 0 or 255
% assumes a 3x3 neighborhood
if(n ==255 || n ==0)
Y(c) = median(X) % yes, replace with median of column values
else
Y(c) = n % no, use original value
end
end
end
但是,当median
和比较运算符已经在整个矩阵上按列工作时,不需要在列上循环。做同样事情的更简洁的方法是:
function [Y] = Lab3_2(X)
Y = X(5,:) % initialize Y to current pixel
bw_indices = (Y == 255 | Y == 0); % get indices of 0,255 values
X_median = median(X); % take medians of all columns
% replace 0,255 values with their corresponding medians
Y(bw_indices) = X_median(bw_indices);
end