Ein Bild wirkt visuell
kontrastreicher, wenn alle
Grauwerte gleich häufig auftreten. Statt einfach nur den verwendeten Kernbereich des Spektrum zu skalieren ist es bei den möglichen Grauwertstufen (also 256 bei 8 Bit) eleganter die
Palette so zu verteilen, dass jeder Grauwert eines Bildes gleichen
Verteilung belegt ist.
Das hört sich kompliziert an, ist aber tatsächlich recht einfach:
Private Sub histo_linear_Click()
Dim histo(255) As Long
Dim min%, max%, farb(2) As Integer
farb(0) = 0
farb(1) = 0
farb(2) = 0
Dim LUT(255)
Dim g
Dim m!, ps!, hs!
m! = header.Höhe * header.Breite
ps! = 0
hs! = 0
For g = 0 To 255
ps! = ps! + (histo(g) / m!)
hs! = hs! + ps!
LUT(g) = (hs! * 256) - 1
Next g
Dim x, y, wert
For x = 0 To header.Breite - 1
For y = 0 To header.Höhe - 1
wert = Bildmatrix(y, x)
pic.PSet (x, header.Höhe - y), rgb(LUT(wert), LUT(wert), LUT(wert))
Bildmatrix(y, x) = LUT(wert)
Next y
Next x
Histogra histo, max, min, farb
End Sub
Der Algorithmus bildet die sogenannte Summenhäufigkeit. Es wird berechnet, wie oft ein Paletteneintrag bei Gleichverteilung in dem Bild vorkommen darf. Danach werden die Paletteneinträge einfach so gesetzt, dass sie genau an der Stelle liegen, wo sie bei gleicher Verteilung sein müssten.