我构建了一个程序,用于从图像创建基于文本的直方图。
现在,我需要从文本文件中提取数据,并找到计数最多的最大值和计数最多的最小值。
这是生成的文本文件中的示例:
0 1
1000 80
10004 2
10005 200
10006 2
1002 73
105 10
在左侧,我列出了像素值,在另一侧列出了计数。
因此,在这里,我得到的值10005
是最大的,具有最高的计数(200
),值1000
是最小的,具有最高的计数(80
)。
我知道如何逐行读取文本文件,拆分值并将它们放在数组中。
问题是,假设我正在处理在直方图文本文件中生成一长串值(数百个)的大型图像,怎么能以最快的方式获得所需的信息?
答案 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
数组替换为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