【问题标题】:MATLAB: Sliding colfilt problem with custom functionMATLAB:自定义函数的滑动 colfilt 问题
【发布时间】:2018-10-10 23:51:35
【问题描述】:

我正在尝试使用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 是带有椒盐噪声的图像。

问题是我得到了这个错误:

使用 reshape 时出错要 RESHAPE 元素的数量不能改变。

colfilt 中的错误(第 182 行) reshape(feval(fun,x,params{:}),block(1),block(2));

我阅读了文档,它说函数必须返回一个行向量,其中包含临时矩阵中每一列的单个值。

我认为我没有正确执行此操作(我指的是我的输出变量 Y),而且我不确定 n = X(5) 行是否正确。

有人知道我该如何解决吗?

【问题讨论】:

    标签: matlab computer-vision


    【解决方案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
    

    【讨论】:

    • 谢谢你,你的回答真的很有帮助。我尝试使用第二个版本,但我仍然得到相同的错误:错误使用重塑来重塑元素的数量不能改变。 colfilt 中的错误(第 182 行)reshape(feval(fun,x,params{:}),block(1),block(2));它似乎在处理输出行向量时发生。
    • 我不得不更改运算符“||”对于“|”但现在工作正常。感谢您的帮助。
    • 酷。我在 Octave 上对其进行了测试,逻辑运算符在那里的行为不同。我将在工作 MATLAB 版本的答案中更改它。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2012-08-14
    相关资源
    最近更新 更多