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

[bcb] Szybka transformacja Fouriera

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez polymorphism » niedziela, 16 września 2012, 21:59

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez kubawodzu » poniedziałek, 17 września 2012, 19:37

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.
Avatar użytkownika
kubawodzu
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): piątek, 13 lipca 2012, 14:14
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Winda 7 pro 64
Kompilator: Borland C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez polymorphism » poniedziałek, 17 września 2012, 19:51

Jaki jest format bitmapy?

p.s. używaj znaczników CPP dla kodów C++. I formatuj kod, żeby dało się go czytać.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez kubawodzu » poniedziałek, 17 września 2012, 20:14

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ę.
Avatar użytkownika
kubawodzu
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): piątek, 13 lipca 2012, 14:14
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Winda 7 pro 64
Kompilator: Borland C++ 6
Gadu Gadu: 0
    Windows 7Chrome

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez polymorphism » poniedziałek, 17 września 2012, 20:21

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?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez kubawodzu » poniedziałek, 17 września 2012, 20:54

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
Avatar użytkownika
kubawodzu
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): piątek, 13 lipca 2012, 14:14
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Winda 7 pro 64
Kompilator: Borland C++ 6
Gadu Gadu: 0
    Windows 7Chrome

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez polymorphism » poniedziałek, 17 września 2012, 22:40

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).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez kubawodzu » wtorek, 18 września 2012, 12:23

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.
Avatar użytkownika
kubawodzu
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): piątek, 13 lipca 2012, 14:14
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Winda 7 pro 64
Kompilator: Borland C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez polymorphism » wtorek, 18 września 2012, 12:50

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ć?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez kubawodzu » wtorek, 18 września 2012, 13:15

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ę.
Avatar użytkownika
kubawodzu
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): piątek, 13 lipca 2012, 14:14
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Winda 7 pro 64
Kompilator: Borland C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez polymorphism » wtorek, 18 września 2012, 14:21

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez kubawodzu » wtorek, 18 września 2012, 14:32

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);
               
                }
        }
 
Avatar użytkownika
kubawodzu
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): piątek, 13 lipca 2012, 14:14
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Winda 7 pro 64
Kompilator: Borland C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez polymorphism » wtorek, 18 września 2012, 14:41

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
kubawodzu
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [bcb] Szybka transformacja Fouriera

Nowy postprzez kubawodzu » wtorek, 18 września 2012, 15:06

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ść.
Avatar użytkownika
kubawodzu
Bladawiec
Bladawiec
 
Posty: 28
Dołączył(a): piątek, 13 lipca 2012, 14:14
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Winda 7 pro 64
Kompilator: Borland C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron