CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [bcb] Szybka transformacja Fouriera
Strona 2 z 2

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: niedziela, 16 września 2012, 21:59
przez polymorphism
widthStep to długość linii (scanline) w bajtach. Pod windowsem i w plikach .bmp linie wyrównane są do czterech bajtów, czyli jeśli bitmapa 24bpp ma szerokość 10 pikseli, długość linii będzie wynosiła 32 bajty (zawartość tych nadmiarowych dwóch bajtów nie ma znaczenia, chodzi tylko o to, żeby długość była podzielna bez reszty przez 4).

Reasumując, widthStep musisz sobie wyliczyć z parametrów bitmapy ;)

---- dodane ----

Z drugiej strony jeśli będziesz korzystał z klasy TBitmap i jej właściwości ScanLine, to nic wyliczać nie musisz, ponieważ właściwość ta służy do poruszania się po liniach bitmapy.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: poniedziałek, 17 września 2012, 19:37
przez kubawodzu
Oki załóżmy że to jest moja funkcja wczytująca dane do tablicy
KOD cpp:     UKRYJ  
for (i = 0, k = 0; i < h; i++)
{
    unsigned char *in =(unsigned char *)Obraz->Picture->Bitmap->ScanLine[i];  
    in[k] = 0.0;
}


i załóżmy ze jest ona poprawa czego na razie nie zakładam to jakbym nie próbował potem wczytać dane do Obrazu to dostaje czarny ekran.

metody jakie stosowałem to :
KOD cpp:     UKRYJ  
        Wynik->Picture->Bitmap->Canvas->Pixels[i][0]= dft[i][0] ;

        Wynik->Picture->Bitmap->Canvas->Pixels[0][j]= dft[i][1]  ;

KOD cpp:     UKRYJ  
Wynik->Picture->Bitmap->Canvas->Pixels[i][j]= dft[i][0]  ;

KOD cpp:     UKRYJ  
Wynik->Picture->Bitmap->ScanLine[i]= dft[i][0]; //tutaj błąd E2060 Illegal use of floating point

i jeszcze z 2 jakieś próby których nie pamiętam ale labo wywalało bład tj. wyżej albo nie działały.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: poniedziałek, 17 września 2012, 19:51
przez polymorphism
Jaki jest format bitmapy?

p.s. używaj znaczników CPP dla kodów C++. I formatuj kod, żeby dało się go czytać.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: poniedziałek, 17 września 2012, 20:14
przez kubawodzu
bitmapa jest formatu 32bity. na samym początku programu każda jest zmieniana.
kod który mia działa jest sformatowany a nad tym, nad którym pracuje to nigdy porządku nie mogę utrzymać. ale zaraz się tym zajmę.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: poniedziałek, 17 września 2012, 20:21
przez polymorphism
Rzucę garścią pytań:
  • dlaczego 32 a nie 24 bity?
  • wiesz chociaż jak kodowany jest kolor RGB?
  • wiesz w jakim formacie (koloru) powinieneś dostarczyć dane funkcji FFT?

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: poniedziałek, 17 września 2012, 20:54
przez kubawodzu
1. 32 bit z tego względu że mam też inne metody przetwarzanie obrazu. (wykrywanie krawędzi, redukcja szumu). Doczytałem na forum (chyba nawet tutaj u cyfrowego albo na Czteryprogramiści) że lepiej borland radzi sobie z strukturą 32 bit. dlatego kompiluje wszystko na 32. po za tym wygodniejsza obsługa.
2. AAAAAAAABBBBBBBBGGGGGGGGRRRRRRRR dla 32. dla 24 bez Ax8
3. tego nie za bardzo rozumiem. Za pewne informacje jaki mamy kolor w danym pikselu. ale format? myślę że to zależy jak mamy dane zakodowane. w tym przypadku 32bity

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: poniedziałek, 17 września 2012, 22:40
przez polymorphism
myślę że to zależy jak mamy dane zakodowane. w tym przypadku 32bity

Myślisz, że funkcja FFT sama się domyśli, jaki format koloru dostała? ;) Jeśli dobrze czytam dokumentację, fftw_plan_dft_2d przyjmuje dane jako ciąg wartości typu fftw_complex, czyli ciąg par wartości typu double/float. W tym typie nie zakodujesz koloru RGB, ponieważ składa się on (kolor) z trzech niezależnych wartości R, G i B. Zatem jeśli chcesz robić analizę, to rób ją na poszczególnych składowych albo analizuj bitmapę monochromatyczną (na jeden piksel przypada 8 bitowy odcień szarości).

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: wtorek, 18 września 2012, 12:23
przez kubawodzu
masz racje. mój błąd że o tym nie pomyślałem. zasugerowałem się jakimś kodem znalezionym w necie i założyłem, że jest prawidłowy.:(
zrobiłem dla każdej składowej, ale nadal nic nie robi. DOmyślam się że źle pobieram wartości.
KOD cpp:     UKRYJ  
 inR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
 inG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
 inB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);

 outR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
 outG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
 outB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);

 wynikR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
 wynikG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
 wynikB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);

for (int y = 0, k = 0; y < height; y++)
        {
        for (int x = 0; x < width; x++, k++)
                {
                int currentIndex = ((y * width) + (x)) * 3;
                color = Obraz->Picture->Bitmap->Canvas->Pixels[i][j];
                rVal = GetRValue(color);
                gVal = GetGValue(color);
                bVal = GetBValue(color);

                inR[y * width + x][0] = (double)rVal;
                inR[y * width + x][1] = 0.0;
                inG[y * width + x][0] = (double)gVal;
                inG[y * width + x][1] = 0.0;
                inB[y * width + x][0] = (double)bVal ;
                inB[y * width + x][1] = 0.0;

                }
        }

 planR = fftw_plan_dft_2d(width, width, inR, outR, FFTW_FORWARD, FFTW_MEASURE);
 planG = fftw_plan_dft_2d(width, width, inG, outG, FFTW_FORWARD, FFTW_MEASURE);
 planB = fftw_plan_dft_2d(width, width, inB, outB, FFTW_FORWARD, FFTW_MEASURE);

 fftw_execute(planR);
 fftw_execute(planG);
 fftw_execute(planB);
 

Za pewne rVal = GetRValue(color) to nie to co mi potrzeba. Próbowałem jeszcze w inny sposób ale tutaj pojawił mi się problem wczytywania wartości do in[k][0] = red[x][y]. nie za bardzo wiem jakby zebrać informacje z red[x][y] do [k].
KOD cpp:     UKRYJ  
                {
                                color = Obraz->Picture->Bitmap->Canvas->Pixels[i][j];
                                red[x][y] = (color & 0xFF);
                                green[x][y] = ((color >> 8) & 0xFF);
                                blue[x][y] = ((color >> 16) & 0xFF);
                        }

ehh muszę powiedzieć że ten kawałek kodu czepie mi po pupie jak nigdy jeszcze.
Domyślam się, że masz już dość moich prymitywnych problemów ale proszę o wyrozumiałość. nie jestem programistą, a jest to moja praca dyplomowa, z tematem, który sam wybrałem. Ponieważ nigdy wcześniej nie uczyłem się C++ postanowiłem wykorzystać możliwość nauki tego języka właśnie po przez pisanie pracy.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: wtorek, 18 września 2012, 12:50
przez polymorphism
KOD cpp:     UKRYJ  
inR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);

Dlaczego dałeś dwa razy width?

(...) nie jestem programistą, a jest to moja praca dyplomowa, z tematem, który sam wybrałem.

Nie rozumiem. Po co brałeś temat, w którym jesteś zielony (w każdym razie jeśli chodzi o implementację)? Wiesz w ogóle co jest wynikiem transformaty i jak ten wynik interpretować?

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: wtorek, 18 września 2012, 13:15
przez kubawodzu
dlaczego dałem 2 razy width. Praca z fft wymaga aby rozmiar wczytywanego obrazu było X^2 Czyli w tej chwili testuje przygotowany obrazek 256X256.
Po co brałem temat taki. Miałem 3 inne tematy ale promotor się nie zgodził. Jeden nawet bardzo ciekawy był no ale cóż, i nie miałem czasu też aby zastanawiać się nad tematem. Jeżeli chodzi o przetwarzanie obrazu to nie było większych problemów i z innymi rzeczami.
tak jeżeli chodzi o transformacje to wiem. Przeprowadzamy transformację Fouriera, przeprowadzamy filtracje( w moim przypadku redukcja szumu czyli dolnoprzepustowy) a na koniec odwrotną transformację.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: wtorek, 18 września 2012, 14:21
przez polymorphism
Praca z fft wymaga aby rozmiar wczytywanego obrazu było X^2 Czyli w tej chwili testuje przygotowany obrazek 256X256.

Ok, tylko pętla, którą wypełniasz tablicę inR, nie powinna korzystać ze zmiennej height. Chodzi o czytelność kodu, ale także o uniknięcie błędów w przyszłości. Zresztą czytam sobie w dokumentacji opis fftw_plan_dft_2d i nigdzie nie widzę wymogu użycia tablicy o rozmiarze 2n. Jedyne co tam wyczytałem to to, że tablice o rozmiarze 2n będą szybciej przetwarzane. No ale wracając do samej pętli i wypełniania tablicy, wygląda mi ona dobrze. Może użycie Pixels nie jest wydajnym rozwiązaniem, ale na razie wystarczy.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: wtorek, 18 września 2012, 14:32
przez kubawodzu
a odczyt?
KOD cpp:     UKRYJ  
 for (int y = 0; y < height; y++)
        {
        for (int x = 0; x < width; x++)
                {
                rVal = wynikR[y * width + x][0];
                gVal = wynikG[y * width + x][0];
                bVal = wynikB[y * width + x][0];
                Wynik->Picture->Bitmap->Canvas->Pixels[i][j] = (TColor)(int)rVal + ((int)gVal << 8) + ((int)bVal << 16);
               
                }
        }
 

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: wtorek, 18 września 2012, 14:41
przez polymorphism
Aaa, źle! W obu przypadkach używasz złych indeksów. Powinieneś użyć indeksów x i y, a masz tam i i j.

Re: [bcb] Szybka transformacja Fouriera

Nowy postNapisane: wtorek, 18 września 2012, 15:06
przez kubawodzu
oczywiście moje niedbalstwo:x. tragedia. Działa:D co prawda efekt na ranie jest przerażający. Za pewne wina kodu odpowiedzialnego za filtr dolnoprzepustowy. Z tym już będzie łatwiej. Dziękuje Ci za pomoc i za cierpliwość.