Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • vijesti
  • Analogna i diskretna metoda kodiranja. Fourierova obrada digitalnih slika

Analogna i diskretna metoda kodiranja. Fourierova obrada digitalnih slika

Slike koje se sastoje od diskretnih elemenata, od kojih svaki može uzeti samo konačan broj razlikovnih vrijednosti koje se mijenjaju tijekom konačnog vremena, nazivaju se diskretnim. Treba naglasiti da elementi diskretne slike, općenito govoreći, mogu imati nejednaku površinu i svaki od njih može imati nejednak broj prepoznatljivih gradacija.

Kao što je prikazano u prvom poglavlju, mrežnica prenosi diskretne slike do viših dijelova vizualnog analizatora.

Njihov prividni kontinuitet samo je jedna od iluzija vida. Ova "kvantizacija" inicijalno kontinuiranih slika nije određena ograničenjima vezanim uz razlučivost optičkog sustava oka, pa čak ni morfološkim strukturnim elementima vizualnog sustava, već funkcionalnom organizacijom neuronskih mreža.

Slika je razbijena na diskretne elemente receptivnim poljima koja kombiniraju jedan ili drugi broj fotoreceptora. Receptivna polja stvaraju primarnu izolaciju korisnog svjetlosnog signala prostornim i vremenskim zbrajanjem.

Središnji dio mrežnice (fovea) zauzimaju samo čunjići, a na periferiji, izvan fovee, nalaze se i čunjići i štapići. U uvjetima noćnog vida konusna polja u središnjem dijelu mrežnice imaju približno istu veličinu (oko 5 "u kutnoj mjeri). Broj takvih polja u fovei, čije su kutne dimenzije oko 90", je oko 200. Glavnu ulogu u uvjetima noćnog vida imaju polja štapića koja zauzimaju ostatak mrežnice. Imaju kutnu veličinu od oko 1 ° po cijeloj površini mrežnice. Broj takvih polja u mrežnici je oko 3 tisuće. Ne samo otkrivanje, već i ispitivanje slabo osvijetljenih objekata u tim uvjetima obavljaju periferna područja mrežnice.

S povećanjem osvjetljenja, drugi sustav skladišnih stanica, konusna receptivna polja, počinje igrati glavnu ulogu. U fovei, povećanje osvjetljenja uzrokuje postupno smanjenje efektivne vrijednosti polja sve dok se pri svjetlini od oko 100 asb ne smanji na jedan konus. Na periferiji, s povećanjem osvjetljenja, polja štapića se postupno gase (inhibiraju) i stupaju u akciju. Polja stošca na periferiji, kao i fovealna polja, imaju sposobnost smanjenja ovisno o svjetlosnoj energiji koja pada na njih. Najveći broj čunjeva, koji mogu imati prijemna polja čunjeva s povećanjem osvjetljenja, raste od središta do rubova mrežnice i na kutnoj udaljenosti od 50-60 ° od središta doseže približno 90.

Može se izračunati da u uvjetima dobrog dnevnog svjetla broj receptivnih polja doseže oko 800 tisuća. Ova vrijednost otprilike odgovara broju vlakana u ljudskom optičkom živcu. Razlučivanje (razlučivanje) objekata u dnevnom vidu provodi se uglavnom preko fovee, gdje se receptivno polje može svesti na jedan konus, a sami čunjići su najgušće smješteni.

Ako se broj stanica za pohranu retine može odrediti u zadovoljavajućoj aproksimaciji, tada još uvijek nema dovoljno podataka za određivanje broja mogućih stanja receptivnih polja. Na temelju proučavanja diferencijalnih pragova receptivnih polja mogu se napraviti samo neke procjene. Kontrast praga u fovealnim receptivnim poljima u određenom radnom rasponu osvjetljenja je reda veličine 1. Broj prepoznatljivih gradacija je mali. U cijelom rasponu restrukturiranja receptivnog polja konusnog foveala razlikuje se 8-9 gradacija.

Razdoblje akumulacije u receptivnom polju - takozvano kritično trajanje - određeno je u prosjeku vrijednošću od oko 0,1 sek., Ali pri visokim razinama osvjetljenja očito se može značajno smanjiti.

Zapravo, model koji opisuje diskretnu strukturu prenesenih slika mora biti još složeniji. Treba uzeti u obzir odnos između veličine receptivnog polja, pragova i kritičnog trajanja, kao i statističku prirodu vizualnih pragova. Ali za sada to nije potrebno. Dovoljno je kao model slike predstaviti skup elemenata istog područja, čije su kutne dimenzije manje od kutnih dimenzija najmanjeg detalja razriješenog okom, čiji je broj prepoznatljivih stanja veći od maksimalnog broj vidljivih gradacija svjetline i čije je diskretno vrijeme promjene manje od razdoblja treperenja pri kritičnoj frekvenciji fuzije treperenja.

Zamijenimo li slike stvarnih kontinuiranih objekata vanjskog svijeta takvim diskretnim slikama, oko neće primijetiti zamjenu * Posljedično, diskretne slike ove vrste sadrže barem ne manje informacija nego što ih vizualni sustav percipira. **

* Slike u boji i volumetrijske slike također se mogu zamijeniti diskretnim modelom.
** Problem zamjene kontinuiranih slika diskretnim je od velike važnosti za filmsku i televizijsku tehnologiju. Vremenska kvantizacija je u središtu ove tehnike. U televizijskim sustavima s pulsnim kodom, slika se također dijeli na diskretne elemente i kvantizira u smislu svjetline.

Ispričati i pokazati na primjeru Pascala: 1) Što je apsolutno i čemu služi? 2) Što je asm i čemu služi? 3) Što je

konstruktor i destruktor i čemu služi?

4) Što je implementacija i čemu služi?

5) Imenujte module Pascal (u retku Uses, na primjer crt) i koje mogućnosti nudi ovaj modul?

6) Koji je tip varijable: pokazivač (Pointer)

7) I za kraj: što znači simbol @, #, $, ^

1. Što je predmet? 2. Što je sustav? 3. Koje je uobičajeno ime objekta? Navedite primjer. 4. Što je naziv jednog objekta? Navedite primjer. 5.

Navedite primjer prirodnog sustava 6. Navedite primjer tehničkog sustava 7. Navedite primjer mješovitog sustava. 8. Navedite primjer nematerijalnog sustava. 9. Što je klasifikacija? 10. Što je klasa značajki?

1.23 pitanje - navedite načine rada subd pristupa:

Izrada tablice u načinu dizajna;
-izrada tablice pomoću čarobnjaka;
-izrada tablice unosom podataka.

2. Što je vektorski format?

3.Može li se sljedeće pripisati servisnim programima:
a) programi za održavanje diska (kopiranje, dezinfekcija, formatiranje itd.)
b) kompresija datoteka na diskovima (arhivatori)
c) borba protiv računalnih virusa i još mnogo toga.
I sam mislim da je odgovor B točan ili nije?

4. što se odnosi na svojstva algoritma (a. Diskretnost, b. Učinkovitost c. Masovnost, d. Određenost, d. Izvedivost i razumljivost) - ovdje mislim da su sve opcije ispravne. U pravu ili u krivu?

7 Jednostavan test višestrukih izbora

13. Frekvencija takta procesora je:

A. broj binarnih operacija koje izvrši procesor po jedinici vremena

B. broj generiranih impulsa u jednoj sekundi koji sinkroniziraju rad računalnih čvorova

C. broj mogućih pristupa procesora RAM-u po jedinici vremena

D. brzina razmjene informacija između procesora i ulazno/izlaznih uređaja

14.Odredite minimalno potreban skup uređaja za računalo:

A. pisač, sistemska jedinica, tipkovnica

B. procesor, RAM, monitor, tipkovnica

C. procesor, streamer, tvrdi disk

D. monitor, sistemska jedinica, tipkovnica

15. Što je mikroprocesor?

A. integrirani mikro krug, koji izvršava naredbe koje pristižu na njegov ulaz i upravlja

Rad na računalu

B. uređaj za pohranjivanje onih podataka koji se često koriste u radu

C. uređaj za izlaz tekstualnih ili grafičkih informacija

D. alfanumerički uređaj za izlaz podataka

16. Interakcija korisnika sa softverskim okruženjem provodi se pomoću:

A. operativni sustav

B. datotečni sustav

C. aplikacije

D. upravitelj datotekama

17. Korisnik može izravno kontrolirati softver iz

uz pomoć:

A. operativni sustav

B. GUI

C. korisničko sučelje

D. upravitelj datotekama

18. Načini pohranjivanja podataka na fizičkom mediju određuju se:

A. operativni sustav

B. aplikacijski softver

C. datotečni sustav

D. upravitelj datotekama

19. Grafičko okruženje na kojem se prikazuju objekti i kontrole Windows sustava,

Stvoren za praktičnost korisnika:

A. hardversko sučelje

B. korisničko sučelje

C. radna površina

D. programsko sučelje

20. Brzina vašeg računala ovisi o:

A. Brzina procesorskog takta

B. prisutnost ili odsutnost povezanog pisača

C. Organizacija sučelja operacijskog sustava

D. vanjski prostor za pohranu

Analogna i diskretna slika. Grafičke informacije mogu se prikazati u analognom ili diskretnom obliku. Primjer analogne slike je slikarsko platno čija se boja kontinuirano mijenja i primjer diskretne slike, crtež otisnut pomoću inkjet pisača, koji se sastoji od zasebnih točaka različitih boja. Analogno (uljano slikarstvo). Diskretna.

Slajd 11 od prezentacije "Kodiranje i obrada informacija"... Veličina arhive s prezentacijom je 445 KB.

Informatika 9 razred

sažetke ostalih prezentacija

Algoritmi račvanja - IF uvjet, THEN action. Što znamo. Struktura lekcije. Algoritam račvanja. Slijedite algoritam i ispunite tablicu. Učenik koji je osvojio od 85 do zaključno 100 bodova prolazi u drugi krug natjecanja. Unesite broj bodova i odredite je li prošao u drugi krug. Pronađite najveći broj između a i b. Napišite program u programskom jeziku. Algoritam grananja je algoritam u kojem se, ovisno o uvjetu, izvodi jedan ili drugi slijed radnji.

„Stvaranje umjetne inteligencije“ – simulacijski pristup. Pristupi izgradnji sustava umjetne inteligencije. Evolucijski pristup. Umjetna inteligencija. Može kohabitirati s mnogim ljudima, pomažući u rješavanju osobnih problema. Strukturalni pristup. Logičan pristup. Problemi u razvoju. Izgledi razvoja i područja primjene.

Ciklični programi - Digit. Petlja s preduvjetom. Pronađite iznos. Petlja s postuvjetom. Petlja s parametrom. Euklidov algoritam. Ciklični programi. Pronađite zbroj prirodnih brojeva. Koncept ciklusa. Početna naknada. Tabularna funkcija. Izračunati. Primjer. Razdjelnici. informatike. Pronađite broj brojeva. Pronaći. Pronađite broj troznamenkastih prirodnih brojeva. Troznamenkasti brojevi. Pronađite skup vrijednosti funkcije. Tablica konverzije dolara.

"Što je e-pošta" - pošiljatelj. Email adresa. Povijest e-pošte. Pitanje nastanka e-pošte. Struktura slova. Usmjeravanje pošte. Pismo. E-mail. Kopirati. Datum. X-mailer. E-mail. Kako funkcionira e-pošta.

"Rad s e-mailom" - E-mail adresa. poštanski sandučić. Protokol e-pošte. Mreža za dijeljenje datoteka. Razdvajanje adresa. Prednosti e-pošte. Klijenti pošte. Izumitelj e-pošte. Adresa. E-mail. Softver za rad s e-poštom. Kako funkcionira e-pošta. Telekonferencija. Poslužitelj pošte. Razmjena datoteka.

"Obrada u Photoshopu" - Cool dečki. Kako razlikovati lažnjak. Rasterske i vektorske slike. Uvod. Vrhunska mjesta. Program Adobe Photoshop. Retuširanje. Photoshop natjecanja. Korekcija svjetline. Moji prijatelji. Praktični dio. Slični programi. Glavni dio. Oblikovati. Neobične životinje. Montaža nekoliko slika.

U prethodnom poglavlju proučavali smo linearne prostorno invarijantne sustave u kontinuiranoj dvodimenzionalnoj domeni. U praksi imamo posla sa slikama koje imaju ograničene veličine i istovremeno se broje u diskretnom skupu točaka. Stoga je dosad razvijene metode potrebno prilagoditi, proširiti i modificirati kako bi se mogle primijeniti i na ovom području. Pojavljuje se i nekoliko novih točaka koje zahtijevaju pažljivo razmatranje.

Teorem uzorkovanja govori pod kojim uvjetima se kontinuirana slika može točno rekonstruirati iz diskretnog skupa vrijednosti. Saznat ćemo i što se događa kada se ne ispune uvjeti za njegovu primjenjivost. Sve to ima puno veze s razvojem vizualnih sustava.

Tehnike koje zahtijevaju prijelaz na frekvencijsko područje postale su popularne dijelom zbog algoritama za brzo izračunavanje diskretne Fourierove transformacije. Međutim, treba biti oprezan jer ove metode pretpostavljaju da je prisutan periodični signal. Razgovarat ćemo o tome kako se ovaj zahtjev može ispuniti i čemu kršenje vodi.

7.1. Ograničavanje veličine slika

U praksi, slike uvijek imaju konačne dimenzije. Razmotrimo pravokutnu sliku širine i visine I. Sada nema potrebe uzimati integrale u Fourierovoj transformaciji u beskonačnim granicama:

Zanimljivo je da za vraćanje funkcije ne moramo znati sve frekvencije. Znati da kada je teško ograničenje. Drugim riječima, funkcija koja je različita od nule samo u ograničenom području ravnine slike sadrži mnogo manje informacija od funkcije koja nema ovo svojstvo.

Da biste to potvrdili, zamislite da je ravnina zaslona prekrivena kopijama dane slike. Drugim riječima, proširujemo našu sliku na funkciju koja je periodična u oba smjera

Ovdje je najveći cijeli broj koji ne prelazi x. Fourierova transformacija takve umnožene slike ima oblik

Korištenje prikladno odabranih faktora konvergencije u vježbi. 7.1 dokazano je da

Stoga,

odakle vidimo da je svugdje jednak nuli, osim za diskretni skup frekvencija. Dakle, da bismo ga pronašli, dovoljno nam je znati u tim točkama. Međutim, funkcija se dobiva jednostavnim izrezivanjem područja za koje. Stoga je za obnavljanje dovoljno da znamo samo za sve.Ovo je prebrojiv skup brojeva.

Imajte na umu da se transformacija periodične funkcije pokazuje diskretnom. Inverzna transformacija se može predstaviti kao niz, budući da

Digitalna fotografija ili druga rasterska slika niz je brojeva snimljenih senzorima razine svjetline u dvodimenzionalnoj ravnini. Znajući da s matematičke točke gledišta tanka leća izvodi Fourierovu transformaciju slika smještenih u žarišnim ravninama, moguće je kreirati algoritme za obradu slike koji su analogni obradi slike klasičnog optičkog sustava.

Formula za takve algoritme će izgledati ovako:

  1. Z = FFT (X) - Izravna 2D Fourierova transformacija
  2. Z ′ = T (Z) - primjena funkcije ili transparentnosti na Fourierovu transformaciju slike
  3. Y = BFT (Z ′) - inverzna 2D Fourierova transformacija
Algoritmi brze diskretne Fourierove transformacije koriste se za izračunavanje Fourierovih transformacija. Iako sustav optičkih leća izvodi Fourierovu transformaciju na kontinuiranom rasponu argumenta i za kontinuirani spektar, pri prelasku na digitalnu obradu podataka, formule Fourierove transformacije mogu se zamijeniti diskretnim formulama Fourierove transformacije.

Primjeri implementacije

  • Algoritam zamućenja slike
Implementirani algoritmi dio su biblioteke otvorenog koda FFTTools. Internet adresa: github.com/dprotopopov/FFTTools

Algoritam zamućenja slike

U optičkim sustavima, dijafragma u žarišnoj ravnini je jednostavan otvor na ekranu. Kao rezultat prolaska svjetlosnog toka kroz dijafragmu, visokofrekventni valovi (s kraćim valnim duljinama) prolaze kroz prepreku, a valovi niske frekvencije (s većim valnim duljinama) su odsječeni ekranom. Time se povećava oštrina rezultirajuće slike. Ako rupu na zaslonu zamijenite preprekom na ekranu, rezultat će biti mutna slika jer će se formirati od frekvencija dugih valnih duljina.

Algoritam:

  1. Izračunajte niz Z ′ = T (Z), gdje je T nuliranje redaka i stupaca koji se nalaze u zadanim unutarnjim područjima matrice argumenata koji odgovaraju visokim frekvencijama 5. (tj. nuliranje koeficijenata Fourierove ekspanzije koji odgovaraju visokim frekvencijama)

Algoritam za izoštravanje slike

U optičkim sustavima, dijafragma u žarišnoj ravnini je jednostavan otvor na ekranu. Kao rezultat prolaska svjetlosnog toka kroz dijafragmu, visokofrekventni valovi (s kraćim valnim duljinama) prolaze kroz prepreku, a valovi niske frekvencije (s većim valnim duljinama) su odsječeni ekranom. Time se povećava oštrina rezultirajuće slike.

Algoritam:

  1. Neka je X (N1, N2) niz svjetline piksela slike.
  2. Izračunajte Px = prosječnu (RMS) svjetlinu piksela u polju X
  3. Izračunaj niz Z = FT (X) - Izravna 2D diskretna Fourierova transformacija
  4. Zadržite vrijednost L = Z (0,0) - koja odgovara prosječnoj svjetlini piksela originalne slike
  5. Izračunajte niz Z ′ = T (Z), gdje je T nuliranje redaka i stupaca koji se nalaze u datim vanjskim područjima matrice argumenata koji odgovaraju niskim frekvencijama 6. (tj. nuliranje Fourierovih koeficijenata proširenja koji odgovaraju niskim frekvencijama)
  6. Vratite vrijednost Z '(0,0) = L - koja odgovara prosječnoj svjetlini piksela originalne slike
  7. Izračunaj niz Y = RFT (Z ′) - Inverzna 2D diskretna Fourierova transformacija
  8. Izračunajte Py = srednju (rms) svjetlinu piksela u nizu Y
  9. Normalizirajte Y (N1, N2) niz na prosječnu Px / Py svjetlinu

Algoritam skaliranja slike

U optičkim sustavima, svjetlosni tok u žarišnoj ravnini sustava je Fourierova transformacija izvorne slike. Veličina slike dobivene na izlazu optičkog sustava određena je omjerom žarišnih udaljenosti objektiva i okulara.

Algoritam:

  1. Neka je X (N1, N2) niz svjetline piksela slike.
  2. Izračunajte Px = prosječnu (RMS) svjetlinu piksela u polju X
  3. Izračunaj niz Z = FT (X) - Izravna 2D diskretna Fourierova transformacija
  4. Izračunajte niz Z ′ = T (Z), gdje je T ili dodavanje nula redaka i stupaca matrice koji odgovaraju visokim frekvencijama, ili uklanjanje redaka i stupaca matrice koji odgovaraju visokim frekvencijama kako bi se dobila potrebna veličina konačne slike
  5. Izračunaj niz Y = RFT (Z ′) - Inverzna 2D diskretna Fourierova transformacija
  6. Izračunajte Py = srednju (rms) svjetlinu piksela u nizu Y
  7. Normalizirajte Y (M1, M2) niz na prosječnu Px / Py svjetlinu
Korišteni softver
  • Microsoft Visual Studio 2013 C # - programsko okruženje i jezik
  • EmguCV / OpenCV - C++ knjižnica struktura i algoritama za obradu slika
  • FFTWSharp / FFTW - biblioteka C ++ koja implementira brze diskretne Fourierove algoritme transformacije

Algoritam zamućenja slike

Algoritamski kod

///

/// Očisti unutarnju regiju polja /// /// Niz vrijednosti /// Veličina unutarnje slijepe regije private static void Blind (Složeni [,] podaci, veličina veličine) (int n0 = data.GetLength (0); int n1 = data.GetLength (1); int n2 = data.GetLength (2); int s0 = Math. Max (0, (n0 - veličina.Visina) / 2); int s1 = Math.Max ​​(0, (n1 - veličina.Širina) / 2); int e0 = Math.Min ((n0 + size.Height) ) / 2, n0); int e1 = Math.Min ((n1 + size.Width) / 2, n1); for (int i = s0; i< e0; i++) { Array.Clear(data, i*n1*n2, n1*n2); } for (int i = 0; i < s0; i++) { Array.Clear(data, i*n1*n2 + s1*n2, (e1 - s1)*n2); } for (int i = e0; i < n0; i++) { Array.Clear(data, i*n1*n2 + s1*n2, (e1 - s1)*n2); } } /// /// Zamućivanje bitmapa uz najbržu Fourierovu transformaciju /// /// Zamućena bitmapa javna Bitmap Blur (bitmap bitmap) (koristeći (var image = new Image (bitmap)) (int length = image.Data.Length; int n0 = image.Data.GetLength (0); int n1 = image.Data.GetLength (1); int n2 = image.Data.GetLength (2); var doubles = new double; Buffer.BlockCopy (image.Data, 0, doubles, 0, length * sizeof (double)); double power = Math.Sqrt (doubles.Average (x => x * x)); var ulaz = novi fftw_complexarray (doubles.Select (x => novi kompleks (x, 0)). ToArray ()); var output = novi fftw_complexarray (duljina); fftw_plan.dft_3d (n0, n1, n2, ulaz, izlaz, fftw_direction. Naprijed, fftw_flags.Estimate) .Execute (); Complex complex = output.GetData_Complex (); var data = new Complex; var buffer = new double; GCHandle complexHandle = GCHandle.Alloc (complex, GCHandleType.Pinned); GCHandleCHandle data); .Alloc (podaci, GCHandleType.Pinned); IntPtr complexPtr = complexHandle.AddrOfPinnedObject (); IntPtr dataPtr = dataHandle.AddrOfPinnedObject (); Marshal.Copy (complexPtr, buffer, 0; buffer.Length, buffer.Ptr.); Slijepi (podaci, _slijepi erSize); Marshal.Copy (dataPtr, međuspremnik, 0, buffer.Length); Marshal.Copy (buffer, 0, complexPtr, buffer.Length); složenHandle.Free (); dataHandle.Free (); input.SetData (složeno); fftw_plan.dft_3d (n0, n1, n2, ulaz, izlaz, fftw_direction.Unatrag, fftw_flags.Procjena) .Izvrši (); dvostruki niz2 = izlaz.GetData_Complex (). Odaberite (x => x.Veličina) .ToArray (); dvostruka snaga2 = Math.Sqrt (niz2.Prosjek (x => x * x)); dupli = niz2. Odaberi (x =>

Algoritam za izoštravanje slike

Algoritamski kod

///

/// Očisti vanjsku regiju polja /// /// Niz vrijednosti /// Veličina vanjskog slijepog područja private static void Blind (Složeni [,] podaci, veličina veličine) (int n0 = data.GetLength (0); int n1 = data.GetLength (1); int n2 = data.GetLength (2); int s0 = Math. Max (0, (n0 - veličina.Visina) / 2); int s1 = Math.Max ​​(0, (n1 - veličina.Širina) / 2); int e0 = Math.Min ((n0 + size.Height) ) / 2, n0); int e1 = Math.Min ((n1 + size.Width) / 2, n1); for (int i = 0; i< s0; i++) { Array.Clear(data, i*n1*n2, s1*n2); Array.Clear(data, i*n1*n2 + e1*n2, (n1 - e1)*n2); } for (int i = e0; i < n0; i++) { Array.Clear(data, i*n1*n2, s1*n2); Array.Clear(data, i*n1*n2 + e1*n2, (n1 - e1)*n2); } } /// /// Oštra bitmapa s najbržom Fourierovom transformacijom /// /// Izoštrena bitmapa javna Bitmap Sharp (Bitmap bitmap) (koristeći (var image = new Image (bitmap)) (int length = image.Data.Length; int n0 = image.Data.GetLength (0); int n1 = image.Data.GetLength (1); int n2 = image.Data.GetLength (2); var doubles = new double; Buffer.BlockCopy (image.Data, 0, doubles, 0, length * sizeof (double)); double power = Math.Sqrt (doubles.Average (x => x * x)); var ulaz = novi fftw_complexarray (doubles.Select (x => novi kompleks (x, 0)). ToArray ()); var output = novi fftw_complexarray (duljina); fftw_plan.dft_3d (n0, n1, n2, ulaz, izlaz, fftw_direction. Naprijed, fftw_flags.Estimate) .Execute (); Složen kompleks = output.GetData_Complex (); Složena razina = složena; var podaci = novi kompleks; var međuspremnik = novi dvostruki; GCHandle complexHandle = GCHandle.Alloc (složen, GCHandleType.Pinned) ; GCHandle dataHandle = GCHandle.Alloc (podaci, GCHandleType.Pinned); IntPtr complexPtr = complexHandle.AddrOfPinnedObject (); IntPtr dataPtr = dataHandle.AddrOfPinnedObject (); Marsthal. buffer.PinnedObject (); Marsthal. međuspremnik.Pinned. ngth); Slijepi (podaci, _blinderSize); Marshal.Copy (dataPtr, međuspremnik, 0, buffer.Length); Marshal.Copy (buffer, 0, complexPtr, buffer.Length); složenHandle.Free (); dataHandle.Free (); složena = razina; input.SetData (složeno); fftw_plan.dft_3d (n0, n1, n2, ulaz, izlaz, fftw_direction.Unatrag, fftw_flags.Procjena) .Izvrši (); dvostruki niz2 = izlaz.GetData_Complex (). Odaberite (x => x.Veličina) .ToArray (); dvostruka snaga2 = Math.Sqrt (niz2.Prosjek (x => x * x)); doubles = array2.Select (x => x * power / power2) .ToArray (); Buffer.BlockCopy (dvostruko, 0, image.Data, 0, length * sizeof (double)); povratna slika.Bitmap; ))

Algoritam skaliranja slike

Algoritamski kod

///

/// Kopiraj nizove /// /// Ulazni niz /// Izlazni niz privatna statička void Copy (Složeni [,] ulaz, Složeni [,] izlaz) (int n0 = input.GetLength (0); int n1 = input.GetLength (1); int n2 = input.GetLength (2); int m0) = output.GetLength (0); int m1 = output.GetLength (1); int m2 = output.GetLength (2); int ex0 = Math.Min (n0, m0) / 2; int ex1 = Math.Min (n1 , m1) / 2; int ex2 = Math.Min (n2, m2); Debug.Assert (n2 == m2); for (int k = 0; k< ex2; k++) { for (int i = 0; i <= ex0; i++) { for (int j = 0; j <= ex1; j++) { int ni = n0 - i - 1; int nj = n1 - j - 1; int mi = m0 - i - 1; int mj = m1 - j - 1; output = input; output = input; output = input; output = input; } } } } /// /// Promjena veličine bitmape uz najbržu Fourierovu transformaciju /// /// Promijenjena veličina bitmapa public Bitmap Stretch (bitmap bitmap) (koristeći (var image = new Image (bitmap)) (int length = image.Data.Length; int n0 = image.Data.GetLength (0); int n1 = image.Data.GetLength (1); int n2 = image.Data.GetLength (2); var doubles = new double; Buffer.BlockCopy (image.Data, 0, doubles, 0, length * sizeof (double)); double power = Math.Sqrt (doubles.Average (x => x * x)); var ulaz = novi fftw_complexarray (doubles.Select (x => novi kompleks (x, 0)). ToArray ()); var output = novi fftw_complexarray (duljina); fftw_plan.dft_3d (n0, n1, n2, ulaz, izlaz, fftw_direction. Naprijed, fftw_flags.Estimate) .Izvrši (); Složeni kompleks = output.GetData_Complex (); korištenje (var image2 = nova slika (_newSize)) (int length2 = image2.Data.Length; int m0 ​​= image2.Data.GetLength (0); int m1 = image2.Data.GetLength (1); int m2 = image2.Data.GetLength (2) ); var complex2 = novi kompleks; var data = novi kompleks; var data2 = novi kompleks; var buffer = novi dvostruki; GCHandle complexHandle = GCHandle.Alloc (kompleks, GCHandleType.Pinned); GCHandle dataHandle = GCHandle.Alloc (podaci, GCHandleType .Pinned ); IntPtr complexPtr = complexHandle.AddrOfPinnedObject (); IntPtr dataPtr = dataHandle.AddrOfPinnedObject (); Marshal.Copy (complexPtr, međuspremnik, 0, buffer.Length); Marshal.Copy (podatakLength, buffer, 0); .Free (); dataHandle.Free (); Kopiraj (podaci, podaci2); međuspremnik = novi dvostruki; complexHandle = GCHandle.Alloc (complex2, GCHandleType.Pinned); dataHandle = GCHandle.Alloc (data2, GCHandleType.Pinned); complexPtr. = complexHandle.AddrOfPinnedObject (); dataPtr = dataHandle.AddrOfPinnedObject (); Marshal.Copy (dataPtr, buffer, 0, buffer.Length); Marshal.Copy (buffer, 0, complexPtr, međuspremnik.Duljina); složenHandle.Free (); dataHandle.Free (); var input2 = novi fftw_complexarray (složeni2); var output2 = novi fftw_complexarray (duljina2); fftw_plan.dft_3d (m0, m1, m2, ulaz2, izlaz2, fftw_direction.Unatrag, fftw_flags.Procjena) .Izvrši (); dvostruki niz2 = izlaz2.GetData_Complex (). Odaberite (x => x.Veličina) .ToArray (); dvostruka snaga2 = Math.Sqrt (niz2.Prosjek (x => x * x)); double doubles2 = array2.Select (x => x * power / power2) .ToArray (); Buffer.BlockCopy (doubles2, 0, image2.Data, 0, length2 * sizeof (double)); return image2.Bitmap; )))

Vrhunski povezani članci