algorytm.org

Histogram - wyrównywanie



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Histogram - wyrównywanie
Ocena użytkowników:***** / 26
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 12 października 2005 19:25


Wyrównywanie histogramu (ang. histogram equalization) ma na celu takie dobranie wartosci aby wykres był mozliwie "płaski". W praktyce wyrównywanie histogramu sprowadza się do wykonania przeksztalcenia obrazu przy pomocy odpowiednio przygotowanej tablicy LUT. Operacja wyrównywania histogramu pozwala na uwypuklenie tych szczegółów w obrazie, które z uwagi na niewielki kontrast sa mało widoczne.
Na początku należy obliczyć dystrybuantę rozkładu prawdopodobieństwa. Jest ona określona wzorem:
D(n) = \frac{h_0 + h_1 + ... + h_n}{s}
dla każdego n = 0 .. maksymalna wartość składowejgdzie s oznacza liczbę wszystkich punktów w obrazie. Zatem wartość dystrybuanty w punkcie i określa liczbę punktów w obrazie o wartości składowej mniejszej lub równej i podzieloną przez liczbę wszystkich punktów w obrazie.

Na podstawie dystrybuanty otrzymujemy tablice LUT, która wyraza się wzorem:
LUT(i) = \frac{D(i) - D_0}{1 - D_0} * (k - 1)
gdzie:
  • i - wartosc składowej obrazu oryginalnego,
  • D0 - pierwsza niezerowa wartosc dystrybuanty obrazu oryginalnego,
  • k - liczba mozliwych wartosci składowych obrazu.

Przykład:

Rozważmy obraz o 20 punktach, dla którego dany jest histogram h = {2, 5, 0, 3, 9, 1}
Dystrybuanta dla niego będzie zatem wyglądała następująco: D = {2/20, 7/20, 7/20, 10/20 , 19/20, 20/20}
Co po przekształceniu na ułamki dziesiętne wgląda tak: D = {0.1, 0.35, 0.35, 0.5 , 0.95, 1}
Teraz obliczymy współczynniki tablicy LUT:
Pierwsza niezerowa wartość dystrybuanty D0 = 0.1
Liczba wartości składowych (liczba elementów histogramu) k = 6
Wartości zakrąglamy w dół (można też zaokrąglać wartości normalnie, tzn. do wartości x.5 w dół a powyżej w górę):
LUT(0) = ((0.1 - 0.1) / (1 - 0.1)) * (5) = 0
LUT(1) = ((0.35 - 0.1) / (1 - 0.1)) * (5) = 1
LUT(2) = ((0.35 - 0.1) / (1 - 0.1)) * (5) = 1
LUT(3) = ((0.5 - 0.1) / (1 - 0.1)) * (5) = 2
LUT(4) = ((0.95 - 0.1) / (1 - 0.1)) * (5) = 4
LUT(5) = ((1 - 0.1) / (1 - 0.1)) * (5) = 5

Należy pokreślić, iż operacja ta nie jest uniwersalna i w przypadku niektórych obrazów może nie przynieść zadowalajacych rezultatów. Poniżej przedstawiono wynik wyrównywania histogramu, dla obrazu kolorowego i monochromatycznego (po lewej obrazy przed operacją wyrównywania histogramu):

Wyrównywanie histogramu

Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiC#Microsoft Visual Studio 2010
.cs
.cs
***** / 0
Tomasz LubińskiC/C++Borland Builder 6
.cpp
.cpp
***** / 8
Tomasz LubińskiDelphi/PascalBorland Delphi 5
.pas
.pas
***** / 4
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 16 sierpnia 2012 19:46
Komentarze
photo
+4 # majsterkus 2009-09-14 02:34

dzięki za pomoc, ze skryptu A.Sluzka"Komputerowa analiza obrazu" ciężko zczaić o co chodzi
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-39 # Andri 2015-06-05 07:44
Tu nie ma co czaić, to trzeba zrozumieć, a nie na chybił-trafił używać algorytmów bez ich zrozumienia. Potem pojawiają się armie beznadziejnych klepaczy kodu.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+3 # -.- 2017-01-20 09:34
przecież majsterkus napisał, że chce zczaić... zczaić czyli zrozumieć.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-4 # Krzysztof85264 2011-04-19 15:59
W Borland Builder 6 jest małe niedociągnięcie . Wg mnie algorytm u mnie działa całkiem nieźle i daje dobre efekty lecz dopiera gdy wszystko co się dało przyrównałem do ZERA. Co prawda straciłem przez to ciekawe efekty graficzne na tym obrazku ale teraz nie mam już losowości w jego działaniu.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz