Matlab 我怎样才能把矩阵中的弱元素归零到强元素附近呢?

Matlab 我怎样才能把矩阵中的弱元素归零到强元素附近呢?,matlab,image-processing,matrix,distance,vectorization,Matlab,Image Processing,Matrix,Distance,Vectorization,我有一个像素矩阵,包含一些点和很多零元素。从这些非零点,我想丢弃那些在矩阵的N范围内有更强点的点。范围是像素之间的欧几里德距离 input = [0.0 0.0 0.0 0.9 0.0 0.0 0.0 0.0 0.2 0.0 0.0 0.5 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.4 0.1 0.0 0.0 0.0]; output = [0.0 0.0 0.0 0.9 0.0 0.0 % 0.7 is

我有一个像素矩阵,包含一些点和很多零元素。从这些非零点,我想丢弃那些在矩阵的N范围内有更强点的点。范围是像素之间的欧几里德距离

input  = [0.0 0.0 0.0 0.9 0.0 0.0 
          0.0 0.0 0.2 0.0 0.0 0.5 
          0.0 0.0 0.7 0.0 0.0 0.0 
          0.0 0.4 0.1 0.0 0.0 0.0];

output = [0.0 0.0 0.0 0.9 0.0 0.0   % 0.7 is the largest number in range
          0.0 0.0 0.0 0.0 0.0 0.5   % 0.2 got removed; was next to 0.9 and 0.7
          0.0 0.0 0.7 0.0 0.0 0.0   % 0.7 is the largest number in range
          0.0 0.0 0.0 0.0 0.0 0.0]; % 0.1 and 0.4 both got removed; were next to 0.7
更新:这是我到目前为止提出的问题。它迭代所有非零像素,并将当前像素与邻域中最大的像素进行比较。但是,该邻域包含的像素数不超过10个。我需要选择一个圆形区域,而不是通过索引偏移来选择区域。此外,如果有一个更短的方法,我将不胜感激,也许可以用内置的Matlab函数替换循环,如
conv2
imfilter

% Discard points near stronger points
points = find(Image > 0);
radius = args.Results.min_dist;
for i = 1:size(points)
    [index_y, index_x] = ind2sub(size(Image), points(i));
    %  Find neighborhood
    from_x = max(index_x-radius, 1);
    from_y = max(index_y-radius, 1);
    to_x = min(index_x+radius, size(Image, 2));
    to_y = min(index_y+radius, size(Image, 1));
    neighbors = Image(from_y:to_y, from_x:to_x);
    % Discard if there is a stronger neighbor
    largest = max(max(neighbors));
    if Image(index_y, index_x) < largest
        Image(index_y, index_x) = 0;
    end
end
%放弃更强点附近的点
点=查找(图像>0);
半径=args.Results.minu dist;
对于i=1:尺寸(点)
[index_y,index_x]=ind2sub(大小(图像),点(i));
%寻找邻居
from_x=最大值(指数_x-半径,1);
from_y=最大值(指数_y-半径,1);
to_x=min(索引_x+半径,大小(图像,2));
to_y=最小值(索引_y+半径,大小(图像,1));
邻居=图像(从y:到y,从x:到x);
%如果有更强的邻居,则丢弃
最大=最大(最大(相邻));
如果图像(索引y,索引x)<最大
图像(索引y,索引x)=0;
结束
结束

有各种免费的MATLAB图像处理工具箱函数的替代品;例如,您可以查看
倍频程
,或者如果这不适合您,请查看,例如,尽管它需要mex编译


您正在寻找具有突然截止的过滤器。过滤器是工具箱中的标准工具。首先看一下工具的文档,如
imfilter
imdiplate
imopen
解决此问题的
基本工作流程可以如下所述-

  • 对所有非零值点进行排序
  • 从值最高的点开始,并将其N邻域内的所有非零点设置为零
  • 对第二高的点执行同样的操作,并将其N邻域内的所有非零点设置为零,不包括值高于当前值的非零点。这个排除部分可以在代码中使用非常有用的MATLAB工具
    triu
    实现
  • 继续,直到覆盖所有非零点。当然,当我们沿着这个阶梯向下移动时,会有较少的点需要搜索,因为前面讨论了排除子句
  • 这些步骤可以通过矢量化方法实现,不使用特殊的工具箱,并假设
    a
    作为输入-

    %// Distance parameter
    N = 2; 
    
    %// Find all non-zero points and then sort them in descending manner
    [x,y] = find(A~=0)
    pts = [x y]
    [val,sorted_idx] = sort(A(A~=0),'descend')
    pts = pts(sorted_idx,:)
    
    %// Find euclidean distances
    distmat = sqrt(squared_dist(pts,pts))
    
    %// Find points to be removed (set to zero); then calculate their linear indices
    rm_pts = pts(any(triu(distmat<N,1),1),:)
    rm_lin_idx = sub2ind(size(A),rm_pts(:,1),rm_pts(:,2))
    
    %// Use those linear indices to set those in the input as zeros
    out = A;
    out(rm_lin_idx) = 0;
    
    代码运行-

    A =
             0         0         0    0.9000         0         0
             0         0    0.2000         0         0    0.5000
             0         0    0.7000         0         0         0
             0    0.4000    0.1000         0         0         0
    out =
             0         0         0    0.9000         0         0
             0         0         0         0         0    0.5000
             0         0    0.7000         0         0         0
             0         0         0         0         0         0
    

    如果您安装了图像处理工具箱(或中提到的免费替代品之一),您可以非常轻松地实现这一点:

    函数
    imdeplate
    基本上是一个滑动最大滤波器。所以我们要做的是,对于每个像素,我们寻找半径
    R
    指定的邻域中的最大值。然后我们将实际值与找到的最大值进行比较,如果较小,则将该值设置为零

    function A = zeroOutWeakElements(A, R)
    [X,Y] = ndgrid(-ceil(R):ceil(R));
    neighborhood = (X.^2 + Y.^2)<=R^2;
    A(imdilate(A,neighborhood)>A) = 0;
    
    函数A=zerooweakelements(A,R)
    [X,Y]=ndgrid(-ceil(R):ceil(R));
    邻域=(X.^2+Y.^2)A)=0;
    

    对于较大的完整矩阵和较小的距离,这也将比当前接受的解决方案快得多。稀疏矩阵和大半径的好处会逐渐消失,但我想你应该用实际数据进行测试,以确定什么是最好的。

    如何定义“强点”?@Divakar By strong point,我只是指像素矩阵中的较大值。这就是我指的如何定义“强”和“弱”。我猜这里一定有一些加权标准。你有图像处理工具箱吗?@mehmet如果只有较小的像素(或者根本没有像素),我想将像素保持在0.3以下在N的欧几里德距离内,您可以使用
    fspecial
    指定自己的内核,同时寻找
    max
    。。。我花了一点时间思考了一下
    sort
    triu
    any
    的可选组合。。。真的很优雅@谢谢!这真的是解决方案中最棘手的事情之一,我想!)非常优雅的解决方案使用形态学+1.
    function A = zeroOutWeakElements(A, R)
    [X,Y] = ndgrid(-ceil(R):ceil(R));
    neighborhood = (X.^2 + Y.^2)<=R^2;
    A(imdilate(A,neighborhood)>A) = 0;