graficzna prezentacja rozkładu jasności fotografii cyfrowej
-
- Posty: 12
- Rejestracja: 07 cze 2009 20:08
- Kontakt:
Re: graficzna prezentacja rozkładu jasności fotografii cyf
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];
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];
- 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
Problem polega na tym że w twojej definicji tablicadanych jest zmienną (jeden element) a nie tablicą: a powinno być: jeszcze inny sposób (z wykorzystaniem wskaźników i dynamicznej alokacji): - definicja: - sposób alokacji - zwolnienie pamięci
Przy poprawnej definicji tablicy poprawny zapis będzie: a i jeszcze powinno być: 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).
Kod: Zaznacz cały
double tablicadanych; //zmienna
Kod: Zaznacz cały
double tablicadanych[256]; //wektor 256-elementowy double tablicadanych[][]...[]; //tablica wielowymiarowa
Kod: Zaznacz cały
double *tablicadanych = NULL;
Kod: Zaznacz cały
tablicadanych = malloc (iloscelementow*sizeof(double));
Kod: Zaznacz cały
free (tablicadanych);
Kod: Zaznacz cały
Histogram (tablicadanych, iloscelementow, 0.0, 255, hist, osx, 256);
Kod: Zaznacz cały
int hist[256];
w palcu siła...
-
- Posty: 12
- Rejestracja: 07 cze 2009 20:08
- Kontakt:
Re: graficzna prezentacja rozkładu jasności fotografii cyf
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...
- 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
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...
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...
-
- Posty: 12
- Rejestracja: 07 cze 2009 20:08
- Kontakt:
graficzna prezentacja rozkładu jasności fotografii cyfrowej
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?
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?
-
- Posty: 12
- Rejestracja: 07 cze 2009 20:08
- Kontakt:
graficzna prezentacja rozkładu jasności fotografii cyfrowej
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...
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...
- 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
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.
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 Reszta nie budzi zastrzeżeń.
P.S.:Mam nadzieję że te moje robaczki są w miarę czytelne.
Kod: Zaznacz cały
for (i=0; i<iloscelementow; i++)
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.)
P.S.:Mam nadzieję że te moje robaczki są w miarę czytelne.
w palcu siła...
-
- Posty: 12
- Rejestracja: 07 cze 2009 20:08
- Kontakt:
graficzna prezentacja rozkładu jasności fotografii cyfrowej
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 ?
Możesz mi powiedzieć czy byłoby dużo pracy z przejściem z RGB na przestrzeń HSL bądź HSV ?
- 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
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): 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).
Kod: Zaznacz cały
L=(max+min)/2;
Ostatnio zmieniony 26 sie 2009 00:29 przez maciekwp, łącznie zmieniany 3 razy.
w palcu siła...