Есть ли способ использовать аналогичный метод для minMaxLoc OpenCV, чтобы получить список из n максимальных значений вместо только одного максимального значения?

#c# #opencv #opencvsharp

#c# #opencv

Вопрос:

MinMaxLoc возвращает min и max заданные значения input array , однако я хотел бы указать n max значения этого массива?

Это единственный способ выполнить цикл, если да, то как это сделать с помощью OpenCvSharp ?

Мое изображение выглядит примерно так:

введите описание изображения здесь

Комментарии:

1. Является ли массив одномерным или многомерным? Почему вы хотите сделать это с помощью OpenCvSharp ?

2. Мой конкретный ввод представляет собой двумерный массив серого изображения

3. После некоторого поиска в Google я, похоже, не могу найти общее решение с использованием OpenCvSharp : (Я думаю, вам придется создать свое собственное решение. Мой c # устарел, поэтому я не знаю, насколько полезным было бы мое ручное решение на c #. Я могу показать, как я мог бы сделать это на python, если хотите.

4. Да, python может быть очень полезен

5. Добавлен ответ, надеюсь, я правильно интерпретировал ваш вопрос и, надеюсь, ответ полезен.

Ответ №1:

Вот как я бы сделал это на python (мой c # устарел, и я не смог найти в Google ничего о том, как найти n самых больших элементов в OpenCvSharp ).

 data = [[1,2,3],[4,5,6],[7,8,9]]

# first, collapse the 2 dimensional input into 1 dimension
collapsed_data = []
for row in data:
    collapsed_data.extend(row)

# now sort the collapsed input and get the 5 largest elements
sorted_data = sorted(collapsed, reverse=True)

k_largest = sorted_data[:k]
  

Обратите внимание, есть более эффективные способы сделать это, используя минимальные / максимальные кучи, но для этого нужно написать много кода, и я не уверен, нужна ли вам производительность. Если вы это сделаете, эти решения находятся на расстоянии Google.

Комментарии:

1. К, это полезно, поэтому я мог бы использовать Linq или что-то еще, вернусь, проверю производительность, поскольку мне нужно, чтобы она была эффективной

Ответ №2:

Предполагая, что у вас есть прямоугольный массив, вы можете получить n максимальных значений с помощью:

 var numValuesToGet = 2;
var inputArray = new int[,] {{1,2},{3,4},{5,6}};
var result = inputArray.Cast<int>().OrderByDescending(x=>x).Take(numValuesToGet);
  

Аналогично, вы могли бы получить n минимальных значений, заменив OrderByDescending на OrderBy .