【问题标题】:neighbor analysis in MATLABMATLAB 中的邻域分析
【发布时间】:2014-01-27 17:31:52
【问题描述】:

我有一个名为 A 的 m×n 矩阵,其值为 1 和 0。如果 8 个相邻像素中至少有 5 个是 1,我想将所有 0 值转换为 1。我尝试的是使用 nlfilter 函数,但我不知道应该如何使用 arg fun,我需要帮助。 我为nlfilter 创建了一个函数作为句柄,如下所示:

function b = gap_fill(A)
b=A;
index= A([1 2 3 4 6 7 8 9]);
if sum(index)>=5
b(5)= 1
end
end

然后我尝试这样做:

B= nlfilter(A,[3 3],@gap_fill)

但它给出了这个错误:

??? Subscripted assignment dimension mismatch.

Error in ==> nlfilter at 75
    b(i,j) = feval(fun,x,params{:});

有什么建议吗?主要问题是我不习惯处理函数。

= 更新 =

我终于想出了一个好结果。我将函数更改为输出一个标量,当我在nlfilter 中将它用作fun arg 时,它按我想要的方式工作。这是我的代码,感谢您的帮助,我希望它对任何人都有用:

function b = gap_fill(A)
index= A([1 2 3 4 6 7 8 9]);
if sum(index)>=5
A(5)= 1;
end
b=A(5);
end

在 MATLAB 中:

b= nlfilter (A,[3 3],'gap_fill')

【问题讨论】:

    标签: matlab matrix neighbours


    【解决方案1】:

    你可以用blockproc一行完成:

    B = blockproc(A,[1 1],@(x)sum(x.data(:)),'BorderSize',[1 1],'TrimBorder',0)-A>=5;
    

    例如,

    A =
    
         1     0     1     1     0
         0     0     0     1     1
         1     1     1     1     1
         0     1     0     1     1
    

    给出结果

    B =
    
         0     0     0     0     0
         0     1     1     1     0
         0     0     1     1     1
         0     0     1     0     0
    

    请注意,由于使用了blockproc'BorderSize' 选项,图像的边框像素得到了正确处理。

    要保留A 中的原始值,请应用最终的“或”运算:

    B = B|A;
    

    【讨论】:

    • 我需要避免将 1 转换为 0,如您的示例 B 中所示
    • @umbe1987 应用最终的“或”运算:B = B|A;(查看更新的答案)
    【解决方案2】:

    我认为这是因为nlfilter 的文档说用户函数必须返回一个标量,而您正试图返回一个矩阵。

    B = nlfilter(A, [m n], fun) applies the function fun to each m-by-n sliding block 
    of the grayscale image A. fun is a function that accepts an m-by-n matrix as input
    and returns a scalar (!!!) result.
    

    【讨论】:

      【解决方案3】:

      对于比blockproc 稍快的解决方案,您可以使用 2D 卷积:

      mask = ones(3);
      mask(5) = 0;
      B = conv2(A,mask,'same') >= 5;
      

      为了使这更快(只有在数组变大时才会注意到这一点),您可以利用平均过滤器是可分离的这一事实:

      B = conv2(conv2(A,ones(1,3),'same'),ones(3,1),'same') - A >= 5;
      

      【讨论】:

        【解决方案4】:

        如果你的 fun 函数返回一个矩阵,它必须返回一个标量。来自matlab

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

        c = fun(x)
        

        所以你的代码应该是有更好的编码方法,特别是使用 amtrix 但遵循你的示例:

        function b = gap_fill(A)
        index= A([1 2 3 4 6 7 8 9]);
        if A(5)sum(index)>=5
            b = 1;
        else
            b = A(5);
        end
        end
        

        对不起,我将 b = 0 更改为 b= A(5)

        【讨论】:

        • 不幸的是,这段代码也将一些 1 转换为 0,我不得不避免它。
        • 是的,没错,我忘记检查它是否已经是一个,我会编辑它
        猜你喜欢
        • 2023-03-24
        • 2014-10-18
        • 1970-01-01
        • 2018-08-10
        • 1970-01-01
        • 2013-12-17
        • 2014-05-13
        • 2011-12-30
        相关资源
        最近更新 更多