graficzna prezentacja rozkładu jasności fotografii cyfrowej

Jeśli masz problem z LabWindows napisz, postaramy się pomóc.
master1985
Posty: 12
Rejestracja: 07 cze 2009 20:08
Kontakt:

Re: graficzna prezentacja rozkładu jasności fotografii cyf

Post autor: master1985 »

Taka jest linijka z histogramem:
Histogram (&tablicadanych, iloscelementow, 0.0, 255, hist, osx, 256);
po kompilacji wyrzuca błąd "argument to small" przy "&tablicadanych". Nie wiem czy zmienna "tablicadanych" powinna być ze znakiem "&" ale bez niego kompilator nie chciał mnie puścić.
Deklaracja zmiennych: int uchwytbmp,status,*color,bytesperrow,pixels; int width,height,i,red,green,blue,iloscelementow; unsigned char *bits,*mask,*alpha; double tablicadanych; int *hist; double osx[256];
Awatar użytkownika
maciekwp
Posty: 46
Rejestracja: 03 kwie 2007 00:00
Wersja środowiska: Nie mam LabVIEW
Lokalizacja: Warszawa

Re: graficzna prezentacja rozkładu jasności fotografii cyf

Post autor: maciekwp »

Problem polega na tym że w twojej definicji tablicadanych jest zmienną (jeden element) a nie tablicą:

Kod: Zaznacz cały

double tablicadanych; //zmienna
a powinno być:

Kod: Zaznacz cały

 double tablicadanych[256]; //wektor 256-elementowy double tablicadanych[][]...[]; //tablica wielowymiarowa 
jeszcze inny sposób (z wykorzystaniem wskaźników i dynamicznej alokacji): - definicja:

Kod: Zaznacz cały

 double *tablicadanych = NULL; 
- sposób alokacji

Kod: Zaznacz cały

 tablicadanych = malloc (iloscelementow*sizeof(double)); 
- zwolnienie pamięci

Kod: Zaznacz cały

 free (tablicadanych); 
Przy poprawnej definicji tablicy poprawny zapis będzie:

Kod: Zaznacz cały

Histogram (tablicadanych, iloscelementow, 0.0, 255, hist, osx, 256);
a i jeszcze powinno być:

Kod: Zaznacz cały

int hist[256];
tak samo jak dla osx. W tablicadanych muszą być dane wyciągnięte z tablicy bits (składowe RGB, średnia lub jak kto woli składowa L), natomiast iloscelementow to rozmiary bitmapy (width*height).
w palcu siła...
master1985
Posty: 12
Rejestracja: 07 cze 2009 20:08
Kontakt:

Re: graficzna prezentacja rozkładu jasności fotografii cyf

Post autor: master1985 »

Program mi się kompiluje, ale przerywa działanie po naciśnięciu przycisku i wtedy wyrzuca błąd przy konwersji zmiennej z unsigned char na double. Coś muszę mieć nie tak z tym bądź z samą deklaracją zmiennych...
Awatar użytkownika
maciekwp
Posty: 46
Rejestracja: 03 kwie 2007 00:00
Wersja środowiska: Nie mam LabVIEW
Lokalizacja: Warszawa

Re: graficzna prezentacja rozkładu jasności fotografii cyf

Post autor: maciekwp »

Polecam przeanalizować działanie programu krok-po-kroku i na bieżąco podglądać wartości zmiennych i tablic. Wszystko jest w helpach do poszczególnych funkcji i w przykładach.
Być może jakiś błąd w definicjach, musisz przejrzeć kod na spokojnie. Powodzenia.

P.S.:Nawet jeśli wcześniej robiłeś coś w C to i tak polecam małe przypomnienie podstaw. Sam się czasem łapię na banalnych rzeczach a głowa nie śmietnik...
w palcu siła...
master1985
Posty: 12
Rejestracja: 07 cze 2009 20:08
Kontakt:

graficzna prezentacja rozkładu jasności fotografii cyfrowej

Post autor: master1985 »

Witam

Mam nadzieję, że pomożesz mi raz jeszcze.
Przeanalizowałem program, skompilował się, ale rysuje mi tylko linię prostą po przekątnej i nie wiem dlaczego.

Czym to może być spowodowane?
master1985
Posty: 12
Rejestracja: 07 cze 2009 20:08
Kontakt:

graficzna prezentacja rozkładu jasności fotografii cyfrowej

Post autor: master1985 »

Już doszedłem do tego, dlaczego rysowało mi linię tylko po przekątnej, po prostu miałem niewłaściwie dobrane parametry przy funkcji ploty.
Ale mam jeszcze jeden problem, poszczególne przebiegi rozkładu RGB wyglądają tak samo. Nie wiem z czego to wynika. Poniżej przedstawiam procedurę dla jednego koloru, dwa pozostałe wyglądają analogicznie:
GetBitmapFromFile (tablica, &uchwytbmp); AllocBitmapDataEx (uchwytbmp, &color, &bits, &mask, &alpha); GetBitmapData (uchwytbmp, &bytesperrow, &pixels, &width, &height, color, bits, mask); iloscelementow = width*height;
tablicadanych = malloc (iloscelementow*sizeof(double));
for (i=0;i<255;i++) {


blue=bits[i*4];


tablicadanych = (double)(blue);

} Histogram (tablicadanych, iloscelementow, 0.0, 255, hist, osx, 256); PlotY (panelHandle, PANEL_GRAPH, tablicadanych, 255, VAL_DOUBLE, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_BLUE);
free (tablicadanych);

Tak mniej więcej wygląda procedura, siedzę nad tym już dosyć długo i nie mogę dojść do tego co jest nie tak...
Awatar użytkownika
maciekwp
Posty: 46
Rejestracja: 03 kwie 2007 00:00
Wersja środowiska: Nie mam LabVIEW
Lokalizacja: Warszawa

Re: graficzna prezentacja rozkładu jasności fotografii cyf

Post autor: maciekwp »

Z tego co widzę to nie wczytujesz wszystkich danych. Tablica "bits" (w której składowe elementy przyjmują wartości 0..255) jest "iloscelementow"-elementowa (jak już pisałem dla koloru 32bit pojedynczy element ma 4bajty) tak samo jak "tablicadanych" a ty wczytujesz tylko pierwsze 256 elementów.

Kod: Zaznacz cały

 for (i=0; i<iloscelementow; i++) 
To dopiero funkcja "Histogram" daje na wyjściu ilości wystąpień poszczególnych wartości dla zadeklarowanych 256 przedziałów.
Pamiętaj też o inkrementacji indeksu podczas odczytu poszczególnych składowych koloru

Kod: Zaznacz cały

 struktura bits[..]:
|bits[0]|bits[1]| bits[2] |... |0|1|2|3|4|5|6|7|8|9|10|11|... |B|G|R|0|B|G|R|0|B|G|R |0 |...
stąd:
blue=bits[i*4]; (bajty: 0, 4, 8 ... itd.) green=bits[i*4+1]; (bajty: 1, 5, 9 ... itd.) red=bits[i*4+2]; (bajty: 2, 6, 10 ... itd.) 
Reszta nie budzi zastrzeżeń.
P.S.:Mam nadzieję że te moje robaczki są w miarę czytelne.
w palcu siła...
master1985
Posty: 12
Rejestracja: 07 cze 2009 20:08
Kontakt:

graficzna prezentacja rozkładu jasności fotografii cyfrowej

Post autor: master1985 »

Dzięki wielkie, właśnie wczoraj w nocy do tego doszedłem i już działa.

Możesz mi powiedzieć czy byłoby dużo pracy z przejściem z RGB na przestrzeń HSL bądź HSV ?
Awatar użytkownika
maciekwp
Posty: 46
Rejestracja: 03 kwie 2007 00:00
Wersja środowiska: Nie mam LabVIEW
Lokalizacja: Warszawa

Re: graficzna prezentacja rozkładu jasności fotografii cyf

Post autor: maciekwp »

Najpierw znajduje się max i min z wartości składowych r,g,b i wylicza L (dla każdego piksela w bitmapie oczywiście):

Kod: Zaznacz cały

 L=(max+min)/2; 
Tak wygląda sama składowa L i Histogram (niemal niezauważalna różnica w porównaniu ze średnią z RGB, a przynajmniej w tym przypadku).
Ostatnio zmieniony 26 sie 2009 00:29 przez maciekwp, łącznie zmieniany 3 razy.
w palcu siła...
ODPOWIEDZ