Posts Tagged ‘histogram’

PostHeaderIcon Zmiana histogramu

Dany jest kolorowy obraz. Przekształć obraz tak, by jego histogram miał kształt zbliżony do histogramu narysowanego przez użytkownika programu.

ściągnij kod źródłowy : HistogramChanger (7z)

ściągnij plik wykonywalny : HistogramChanger (7z)

Działanie programu rozpoczyna się od wczytania pliku graficznego w formacie PNG, BMP lub TIF.
Po wczytaniu obrazu następuje konwersja przestrzeni barw obrazu na HSI. Jako histogram będzie traktowany rozkład I (intensywności) z systemu barw HSI.
Następnie następuje sporządzenie histogramu dla barw R, G, B (które są wyświetlane jedynie w celach poglądowych, nie mają zastosowania w funkcjonowaniu algorytmu) oraz dla I. Mając dany rozkład I, rysowana jest następnie jego dystrybuanta (tablica o nazwie cdf1 w programie).
Użytkownik kreśli dowolny kształt histogramu w oknie wykresu w dolnej części programu. Na podstawie tego wykresu również sporządzania jest dystrybuanta (cdf2).
Teraz dla każdej wartości osi X na wykresie cdf1, należącej do przedziału <0; 255>, sprawdzana jest odpowiadająca jej wartość dystrybuanty. Obliczona wartość jest następnie przenoszona na wykres cdf2 i sprawdzane zostaje, jakiemu argumentowi ona odpowiada. Tak przeprowadzone rozumowanie pozwala określić, jak należy zamienić jasność pikseli, aby uzyskać zadany kształt histogramu. Informacje te są zapisywane do tablicy lut, której indeks oznacza wartość jasności obrazu wejściowego, natomiast wartość tablicy przy danym indeksie – jasność, na którą należy dany indeks zamienić w całym obrazie.
Za wykonanie tej operacji odpowiada następujący fragment kodu:

Posiadając tę informację, algorytm przebiega po wszystkich pikselach obrazu i podmienia odpowiednie wartości I. Na końcu następuje konwersja systemu do RGB i wyświetlenie na ekranie obrazu wynikowego po lewej stronie okna. Program umożliwia zapis pliku wynikowego w postaci pliku TIF

Poniżej zaprezentowano zrzuty ekranu z działającego programu:


Rys. 1. Wykreślenie histogramu, który wpływa na przyciemnienie obrazu


Rys. 2. Histogram powodujący rozjaśnienie obrazu


Rys. 3. Próba wyrównania histogramu na rozjaśnionym obrazie

Wykonanie programu wymagało również napisania funkcji służących do wzajemnej konwersji systemu barw RGB i HSI (do tego celu służą funkcje hsi2rgb oraz rgb2hsi)

Program został napisany w języku C++ w środowisku Qt oraz przy użyciu biblioteki służącej do tworzenia wykresów – Qwt.
Aplikacja jest przenośna między różnymi systemami na poziomie kodu źródłowego (przetestowane działanie pod Windowsem oraz Linuxem). Program w całości został stworzony przy użyciu narzędzi open-source, kompiluje się bez żadnych ostrzeżeń na najwyższym poziomie w kompilatorze gcc (Linux) oraz mingw (Windows).

Bibliografia:

Podczas opracowywania programu korzystałem z następujących źródeł informacji:

http://www.had2know.com/technology/hsi-rgb-color-converter-equations.html – opracowanie teoretyczne konwertora HSI → RGB oraz RGB → HSI
http://theiszm.wordpress.com/2010/07/06/5-image-enhancement-by-histogram-manipulation/ – omówienie zależności między dystrybuantą histogramu a pożądanym kształtem histogramu