gpt4 book ai didi

matlab - 如何将矩阵中强元素附近的弱元素归零?

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:45 28 4
gpt4 key购买 nike

我有一个包含一些点和很多零元素的像素矩阵。从那些非零点开始,我想丢弃那些在矩阵范围 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

更新:这就是我到目前为止的想法。它遍历所有非零像素并将当前像素与最大的邻域像素进行比较。然而,邻域包含很多像素。我需要以某种方式选择一个圆形区域,而不是通过索引偏移量来选择区域。此外,如果有更短的方法,我将不胜感激,也许可以用 conv2imfilter 等内置 Matlab 函数替换循环。

% 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

最佳答案

如果您安装了图像处理工具箱(或 Try Hard's answer 中提到的免费替代品之一),您可以很容易地做到这一点:

imdilate 函数基本上是一个滑动最大过滤器。所以我们要做的是,对于每个像素,我们在您的半径 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;

对于大型全矩阵和小距离,这也比当前接受的解决方案快得多。这种优势会随着稀疏矩阵和大半径而逐渐消失,但我想您应该使用实际数据进行测试,以确定什么是最好的。

关于matlab - 如何将矩阵中强元素附近的弱元素归零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28407975/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com