Поиск самых больших и самых маленьких значений с наибольшим количеством гистограмм - PullRequest
0 голосов
/ 10 февраля 2019

Я построил программу для создания текстовой гистограммы из изображения.
Теперь мне нужно взять данные из текстового файла и найти самое большое значение с наибольшим количеством и наименьшее значение с наибольшим количеством.
Это пример из сгенерированного текстового файла:

0 1 
1000 80 
10004 2 
10005 200 
10006 2  
1002 73 
105 10

Слева я перечислил значения пикселей, а с другой стороны подсчитал.

Итак, здесь я получаю значение 10005 как наибольшее с наибольшим количеством (200) и значение 1000 как самое маленькое с наибольшим числом (80).

Я знаю, как читать текстовые файлы построчно, разбивать значения и помещать их в массив.
Вопрос в том, как получить то, что я хочу, самым быстрым способом, предполагая, что я 'ли работать с большими изображениями, генерируя длинные списки значений (сотни) в текстовых файлах гистограммы?

1 Ответ

0 голосов
/ 10 февраля 2019

Определение минимального и максимального значения здесь несколько противоречиво, но, следуя описанию, основная логика может заключаться в том, что минимальное значение может быть определено при обнаружении максимума.

Итак, мы могли бы упорядочить список (несколько сотен строк данных - это не очень много) по убыванию (сначала более высокие значения), оценить максимальное значение и, после этого, определить минимум:

Dim bitmapData = File.ReadAllLines("[Data File Path]").
                    Select(Function(bd) bd.Split(New String() {" "c}, StringSplitOptions.RemoveEmptyEntries).
                    Select(Function(n) Integer.Parse(n)).ToArray()).
                    OrderByDescending(Function(value) value(0)).ToList()


Dim max() As Integer = bitmapData(0)
Dim min() As Integer = {bitmapData(0)(0), 0}

For i As Integer = 1 To bitmapData.Count - 1
    If bitmapData(i)(1) > max(1) Then
        If bitmapData(i + 1)(0) < bitmapData(i)(0) Then
            max = bitmapData(i)
        End If
    ElseIf bitmapData(i)(0) < max(0) Then
        If bitmapData(i)(1) >= min(1) Then
            min = bitmapData(i)
        End If
    End If
Next

Используя ваш образец данных и массив значений для сравнения, получим следующие результаты:

Min ( 1030, 251)     Min ( 1000,  80)
Max (10001, 260)     Max (10005, 200)
--------------------------------------------
      0   1                0   1 
  10001 260             1000  80 
   1000  80            10004   2 
  10004   2            10005 200 
  10005 200            10006   2  
  10006   2             1002  73 
   1002  73              105  10
    105  10
     50 250
     51 220
   1026 201
   1030 251
   1031 250
  10009 252
  10008 250
  10007 251

Предполагая, что источник данных представлен двумя разными массивами (названными Pixels и Counts, здесь), которые должны быть синхронизированы (парные индексированные значения), вам просто нужно заменить массив BitmapData намассив Pixels и Counts:

Dim Pixels As Integer() = [Integer Source]
Dim Counts As Integer() = [Integer Source]

Dim max() As Integer = {Pixels(0), Counts(0)}
Dim min() As Integer = {Pixels(0), 0}

For i As Integer = 1 To Pixels.Count - 1
    If Counts(i) > max(1) Then
        If Pixels(i + 1) < Pixels(i) Then
            max = {Pixels(i), Counts(i)}
        End If
    ElseIf Pixels(i) < max(0) Then
        If Counts(i) >= min(1) Then
            min = {Pixels(i), Counts(i)}
        End If
    End If
Next
...