找出直方图中计数最多的最大值和最小值

时间:2019-02-10 05:19:31

标签: vb.net text histogram

我构建了一个程序,用于从图像创建基于文本的直方图。
现在,我需要从文本文件中提取数据,并找到计数最多的最大值和计数最多的最小值。
这是生成的文本文件中的示例:

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

在左侧,我列出了像素值,在另一侧列出了计数。

因此,在这里,我得到的值10005是最大的,具有最高的计数(200),值1000是最小的,具有最高的计数(80 )。

我知道如何逐行读取文本文件,拆分值并将它们放在数组中。
问题是,假设我正在处理在直方图文本文件中生成一长串值(数百个)的大型图像,怎么能以最快的方式获得所需的信息?

1 个答案:

答案 0 :(得分:1)

在这里,最小值和最大值的定义有些争议,但是根据描述,潜在的逻辑可能是当找到最大值时可以确定最小值。

因此,我们可以通过降序(首先是较高的值)对列表进行排序(几百行的数据实际上不是很多),评估最大值,然后确定最小值:

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 )表示, > synchronized (成对的索引值),只需将 BitmapData 数组替换为PixelsCounts数组:

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