有效地从二维似然矩阵(numpy数组)中提取局部最大值(坐标)

时间:2019-07-08 22:45:27

标签: python numpy image-processing object-detection tracking

我正在尝试从numpy 2D矩阵中提取局部最大值的坐标。这些值是介​​于0和1之间的数字,表示物体在该位置的可能性。

我尝试对矩阵进行阈值处理,提取argmax,保存坐标并将其值更改为0,然后循环直到遇到阈值。

private static final Gson GSON = (new GsonBuilder()).registerTypeAdapter(Boolean.class, new JsonBooleanDeAndSerializer()).create();

对此我不满意,我认为有更有效的优雅方法可以提取局部最大值。想法?

2 个答案:

答案 0 :(得分:1)

定位局部最大值是scikit-image的一项内置功能,它可以在预定的距离内找到最大值。

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('cate_id', 'cate_name')

class SubCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = SubCategory
        fields = ('sub_cate_id', 'sub_cate_name', 'sub_fk')

    def to_representation(self, instance):
        response = super().to_represntation(instance)
        response['sub_fk'] = CategorySerializer(instance.sub_fk).data
        return response

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Products
        fields = ('pro_id', 'pro_name', 'description', 'price', 'quantity', 'pro_cate_fk', 'pro_sub_fk', 'image')

    def to_representation(self, instance):
        response = super().to_representation(instance)
        response['pro_cate_fk'] = CategorySerializer(instance.pro_cate_fk).data
        response['pro_sub_fk'] = ProductSerializer(instance.pro_sub_fk).data
        return response

我不确定这是如何实现的,但是一种实现方法是执行非最大抑制(即迭代矩阵中的每个值并与半径内的所有值进行比较。如果该值在该窗口中不是最大的然后将其设置为零)。然后将所有非零值(可能高于某个置信度阈值)的坐标作为局部最大值的集合。

答案 1 :(得分:0)

如果您要提取Numby矩阵的坐标,则应满足所有阈值的所有值,只需将阈值与整个矩阵进行比较即可。

import numpy as np
data = np.array([
    [0, 0.5, 0.95],
    [0, 0.95, 0.5],
    [0.95, 0.5, 0]
])
thresholded_coordinates = np.argwhere(data > 0.9)

# array([[0, 2], [1,1], [2, 0]])

thresholded_coordinates的输出是成对的坐标集合。 (0,2)表示它是第一行中的第三个值(0索引)。输出显示在最后一行的注释上。