Strona 2 z 2

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

: 09 sie 2009 01:02
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];

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

: 09 sie 2009 14:48
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).

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

: 09 sie 2009 23:19
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...

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

: 09 sie 2009 23:43
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...

graficzna prezentacja rozkładu jasności fotografii cyfrowej

: 21 sie 2009 22:46
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?

graficzna prezentacja rozkładu jasności fotografii cyfrowej

: 23 sie 2009 00:20
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...

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

: 25 sie 2009 11:01
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.

graficzna prezentacja rozkładu jasności fotografii cyfrowej

: 25 sie 2009 16:38
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 ?

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

: 26 sie 2009 00:25
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).