HDR - problem czysto matematyczny

0

Siemka :) Tym razem o dziwo calkiem serio :)

Caly czas kodze sobie ten moj projekt PhotoPOL 2.0 wiele filtrow dodalem bez problemu niektore filtry musialem rozgryzac przez pare dni i zawsze sie udawalo. Tym razem jednak wchodzimy na gleboka wode bo tematyka HDR.

HDR-y tworzy sie majac co najmniej trzy jednakowe obrazki z ta roznica ze obrazki :
1 - przyciemniony
2 - normalny
3 - rozjasniony

Przyciemnianie / rozjasnienie tworzy sie w tym przypadku za pomoca ekspozycji.
I tutaj zadnych problemow oczywiscie nie mam wszystko dziala. Zreszta w ogole juz mam co nieco wykodzone i te HDR-y wychodza jako-tako ale wiem ze to nie do konca to.
Wiem bo porownuje z wynikami otrzymanymi z innych programow a z mojego. I nadal "czegos" brakuje.

Aha jeszcze jedno co dalej z tymi obrazkami. Mamy trzy obrazki jednakowe rozniace sie jedynie ekspozycja. W tym momencie teoretycznie wystarczy juz je "zlozyc" w jedna calosc. W praktyce wychodzi na to ze wzor jest dosc skomplikowany. dlaczego tak mysle napisze za momencik.

Zalezy mi na tym by dodac poprawny algorytm HDR-ow bo to bylby niezly szal :)

teraz cos dla matematykow i w sumie cale sedno sprawy. Wiadomo analizujac algorytm musimy miec pewne dane.
A wiec mamy tak:

  • 3 skladowe R,G,B
  • 4 obrazy z czego 1 to przyciemniony , 2 normalny , 3 , rozjasniony a 4 wynikowy.
  • specialnie dla analizy wylistowalem kwadrat 5x5 z bitmapy wraz z liczbami danych skladowych

zadanie: znalezc jakas zaleznosc :P

oto wylistowanie matematyczne:

Kanal czerowny : 241 , 153 , 6 = 36
Kanal zielony : 248 , 213 , 76 = 40
Kanal niebieski : 254 , 255 , 148 = 58

Kanal czerowny : 242 , 136 , 1 = 68
Kanal zielony : 247 , 193 , 74 = 22
Kanal niebieski : 253 , 246 , 143 = 44

Kanal czerowny : 244 , 139 , 1 = 40
Kanal zielony : 252 , 191 , 74 = 69
Kanal niebieski : 255 , 248 , 143 = 33

Kanal czerowny : 235 , 140 , 1 = 27
Kanal zielony : 249 , 190 , 74 = 42
Kanal niebieski : 249 , 249 , 143 = 68

Kanal czerowny : 245 , 144 , 1 = 68
Kanal zielony : 253 , 193 , 74 = 30
Kanal niebieski : 255 , 252 , 143 = 42

Kanal czerowny : 237 , 132 , 7 = 28
Kanal zielony : 252 , 187 , 74 = 47
Kanal niebieski : 255 , 251 , 152 = 78

Kanal czerowny : 229 , 102 , 0 = 149
Kanal zielony : 242 , 155 , 64 = 33
Kanal niebieski : 248 , 221 , 112 = 91

Kanal czerowny : 237 , 102 , 0 = 82
Kanal zielony : 252 , 151 , 64 = 152
Kanal niebieski : 255 , 220 , 112 = 40

Kanal czerowny : 225 , 105 , 0 = 31
Kanal zielony : 245 , 152 , 64 = 84
Kanal niebieski : 246 , 224 , 112 = 150

Kanal czerowny : 226 , 109 , 0 = 150
Kanal zielony : 243 , 153 , 64 = 36
Kanal niebieski : 251 , 226 , 112 = 85

Kanal czerowny : 228 , 145 , 4 = 34
Kanal zielony : 242 , 191 , 73 = 44
Kanal niebieski : 251 , 253 , 140 = 66

Kanal czerowny : 223 , 110 , 0 = 140
Kanal zielony : 236 , 154 , 62 = 37
Kanal niebieski : 244 , 219 , 119 = 85

Kanal czerowny : 233 , 113 , 0 = 78
Kanal zielony : 248 , 153 , 62 = 146
Kanal niebieski : 255 , 222 , 119 = 37

Kanal czerowny : 230 , 118 , 0 = 33
Kanal zielony : 251 , 155 , 62 = 82
Kanal niebieski : 254 , 225 , 119 = 144

Kanal czerowny : 229 , 116 , 0 = 142
Kanal zielony : 247 , 150 , 62 = 34
Kanal niebieski : 255 , 221 , 119 = 80

Kanal czerowny : 236 , 144 , 1 = 33
Kanal zielony : 246 , 194 , 75 = 40
Kanal niebieski : 255 , 255 , 140 = 68

Kanal czerowny : 244 , 107 , 3 = 151
Kanal zielony : 252 , 155 , 64 = 38
Kanal niebieski : 255 , 219 , 119 = 84

Kanal czerowny : 235 , 114 , 3 = 75
Kanal zielony : 245 , 159 , 64 = 149
Kanal niebieski : 255 , 226 , 119 = 38

Kanal czerowny : 233 , 119 , 3 = 38
Kanal zielony : 248 , 159 , 64 = 79
Kanal niebieski : 255 , 229 , 119 = 145

Kanal czerowny : 233 , 115 , 4 = 147
Kanal zielony : 248 , 153 , 65 = 36
Kanal niebieski : 255 , 224 , 120 = 79

Kanal czerowny : 241 , 146 , 10 = 31
Kanal zielony : 249 , 197 , 73 = 44
Kanal niebieski : 255 , 254 , 140 = 70

Kanal czerowny : 239 , 107 , 0 = 146
Kanal zielony : 243 , 156 , 66 = 31
Kanal niebieski : 255 , 215 , 118 = 86

Kanal czerowny : 232 , 114 , 0 = 79
Kanal zielony : 241 , 158 , 66 = 146
Kanal niebieski : 250 , 221 , 118 = 31

Kanal czerowny : 236 , 119 , 0 = 36
Kanal zielony : 249 , 160 , 66 = 79
Kanal niebieski : 255 , 226 , 118 = 138

Kanal czerowny : 238 , 117 , 0 = 145
Kanal zielony : 249 , 156 , 66 = 35
Kanal niebieski : 253 , 223 , 118 = 81

Gdzie przykladowo :

Kanal czerowny : 238 , 117 , 0 = 145

1.) Kanal na ktorym mamy podane skladowe
249 - wartosc skladowe R w 1 obrazie ( rozjasnionym )
117- wartosc skladowe R w 2 obrazie ( normalnym )
0 - wartosc skladowe R w 3 obrazie ( sciemnionym )
= 145 - wynik w obrazie ostatecznym.

Dla ulatwienia zwizualizowania tego wszystkiego podaje 4 bitmapy na ktorych dzialam i ktore analizuje :

rozjasniony
user image

normalny
user image

sciemniony
user image

wynikowy
user image

Prosze o jakies sugestie badz w ogole algorytm chociaz nie wydaje mi sie by to byl jednolinijkowy wzor :)
Jesli ktos ma to moze podac takze kod chociaz sadze ze akurat w tym przypadku kod zrodlowy na niewiele sie zda z tegop wzgledu ze nie kazdy robi to w ten sam sposob, np widzialem kody korzystajace z tablic LUT, w moim przypadku malo uzyteczne.

Wiec prosilbym o jakies rady na temat tego wzoru / algorytmu :)
z gory dzieki za pomoc i zainteresowanie sie :)

Aha nie zalezy mi na dokladnych wynikach wzor jesli ktos by wpadl na jakis moze byc "mniej-wiecej" podobny do tych wynikow. Moga sie roznic wyniki o pare pkt :)

ps: Wczoraj dodalem funkcje wstepne "usuwanie czerwonych oczu", tradycyjnie kilka roznych mozliwosci etc :)

0

Zacznijmy od tego, że takie rzeczy robi się na HSV. Obrazki się odpowiednio uśrednia za pomocą średniej ważonej. Wagi dobiera się na podstawie składowej S. Tam gdzie S ma wartości zbliżone do dolnego zakresu dynamiki, to obrazek jasny ma większą wagę, a tam gdzie są brane z górnego zakresu, to obrazek ciemny z kolei dominuje. Oczywiście musisz znaleźć wzór, który płynnie dobiera wagi. Przy czym ważne aby wag nie dobierać na bazie pojedynczego piksela, tylko średniej z bliskiego otoczenia.

0

Sadz e ze na RGB tez dam rade. A jesli nie to szybka konwersja bedzie potrzebna ale to niewielki problem. Ok, bede dalej kombinowal, miedzy innymi wlasnie potrzebowalem potwierdzenia ze trzeba dzialac na siatce pikseli a nie tylko na jednym. Tak wynikalo mi z cyfr.

Ok to do dziela, dzieki :)

0

GL_DST_COLOR,GL_SRC_COLOR

poczytaj o HDR w OPenGL

0

OpenGL-a w to mieszac bym niechcial. Infrastruktura programu jest inna i wymagaloby to zbyt gruntownych zmian. Poza tym sadze ze da sie to zrobic latwiej. Fajna wskazowke dal Krolik, ja sam zauwazylem juz pewna zaleznosc :)
Praktycznie juz mam wykodzony ten filtr teraz tylko pracuje nad poprawkami by efekt byl jak najlepszy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1