• Přechod od spojitých signálů a transformací k diskrétním. Analogové a diskrétní zobrazování

    Analogový a diskrétní obraz. Grafické informace mohou být reprezentovány v analogové nebo diskrétní formě. Příkladem analogového obrázku je malba, jejíž barva se plynule mění, a příkladem diskrétního obrázku vytištěného pomocí inkoustová tiskárna vzor sestávající z jednotlivých teček různých barev. Analogové (olejomalba). Oddělený.

    snímek 11 z prezentace "Kódování a zpracování informací". Velikost archivu s prezentací je 445 KB.

    Informatika 9. třída

    shrnutí dalších prezentací

    "Algoritmy struktury větvení" - akce IF podmínka, TAK. Co my víme. Struktura lekce. Algoritmus větvení. Spusťte algoritmus a vyplňte tabulku. Do druhého kola soutěže postupuje student, který získá od 85 do 100 bodů včetně. Zadejte počet bodů a určete, zda prošel do druhého kola. Najděte největší číslo mezi a a b. Napište program v programovacím jazyce. Algoritmus větvení je algoritmus, ve kterém se v závislosti na podmínce provádí jedna nebo druhá sekvence akcí.

    "Vytváření umělé inteligence" - simulační přístup. Přístupy ke konstrukci systémů umělé inteligence. evoluční přístup. Umělá inteligence. Může žít s mnoha lidmi, pomáhá se s tím vyrovnat osobní problémy. Strukturální přístup. logický přístup. Problémy během vývoje. Perspektivy rozvoje a rozsahu.

    "Cyklické programy" - Číslice. Smyčka s předpokladem. Najděte částku. Smyčka s dodatečnou podmínkou. Cyklus s parametrem. Euklidův algoritmus. Cyklické programy. Najděte součet přirozených čísel. Koncept cyklu. Počáteční poplatek. Tabulka funkcí. Vypočítat. Příklad. Děliče. Počítačová věda. Najděte počet čísel. Nalézt. Najděte počet trojciferných přirozených čísel. Třímístná čísla. Najděte sadu hodnot funkcí. Konverzní tabulka dolaru.

    "Co je e-mail" - Odesílatel. Emailová adresa. Historie e-mailů. Problematika e-mailu. Struktura dopisu. Směrování pošty. Dopis. E-mailem. Kopírovat. Datum. X mailer. E-mailem. Jak to funguje E-mailem.

    "Práce s e-mailem" - E-mailová adresa. Poštovní schránka. E-mailový protokol. síť pro sdílení souborů. Oddělení adres. Výhody e-mailu. E-mailové klienty. Email Inventor. Adresa. E-mailem. E-mailový software. Jak funguje e-mail. Telekonference. poštovní server. Sdílení souborů.

    "Zpracování ve Photoshopu" - Super kluci. Jak rozlišit padělek. Rastr a vektorové obrázky. Úvod. Nejlepší místa. program Adobe Photoshop. Retušování. Soutěže ve Photoshopu. Nastavení jasu. Moji přátelé. Praktická část. Podobné programy. Hlavní část. Design. Neobvyklá zvířata. Montáž více obrázků.

    V předchozí kapitole jsme studovali lineární prostorově invariantní systémy ve spojité dvourozměrné doméně. V praxi máme co do činění s obrázky, které mají omezené rozměry a zároveň se počítají v diskrétní sadě bodů. Dosud vyvinuté metody je proto potřeba přizpůsobit, rozšířit a upravit tak, aby je bylo možné v této oblasti aplikovat. Existuje také několik nových bodů, které vyžadují pečlivé zvážení.

    Vzorkovací teorém říká, za jakých podmínek lze spojitý obraz přesně obnovit z diskrétní sady hodnot. Dozvíme se také, co se stane, když nejsou splněny podmínky pro jeho použitelnost. To vše přímo souvisí s vývojem zrakových systémů.

    Techniky, které vyžadují přechod do frekvenční oblasti, se staly populární částečně díky rychlým výpočetním algoritmům. diskrétní transformace Fourier. Je však třeba dávat pozor, protože tyto metody zahrnují periodický signál. Probereme, jak lze tento požadavek splnit a jaké důsledky může mít jeho porušení.

    7.1. Limit velikosti obrázku

    V praxi mají obrázky vždy konečné rozměry. Uvažujme obdélníkový obrázek o šířce a výšce R. Nyní není potřeba brát integrály ve Fourierově transformaci v nekonečných mezích:

    Zajímavé je, že k obnovení funkce nepotřebujeme znát všechny frekvence. Vědět, co v je těžké omezení. Jinými slovy, funkce, která je nenulová pouze v omezené oblasti obrazové roviny, obsahuje mnohem méně informací než funkce, která tuto vlastnost nemá.

    Chcete-li to ověřit, představte si, že rovina obrazovky je pokryta kopiemi daný obrázek. Jinými slovy, rozšiřujeme náš obraz na funkci, která je periodická v obou směrech

    Zde je největší celé číslo menší než x. Fourierova transformace takto znásobeného obrazu má tvar

    Používáním vhodně vybrané faktory konvergence v ex. 7.1 je dokázáno, že

    Proto,

    odkud vidíme, že se rovná nule všude kromě diskrétní množiny frekvencí, takže k jejímu nalezení nám stačí vědět v těchto bodech. Funkce se však získá jednoduchým oříznutím části, pro kterou . K obnově tedy stačí, abychom věděli jen pro každého.To je spočetná množina čísel.

    Všimněte si, že transformace periodické funkce se ukáže jako diskrétní. Inverzní transformace může být reprezentována jako řada, protože

    Diskretizace obrazu.

    Uvažujme spojitý obraz – funkci dvou prostorových proměnných X 1 a X 2 F(X 1 , X 2) na omezené obdélníkové ploše (obrázek 3.1).

    Obrázek 3.1 - Přechod ze spojitého obrazu na diskrétní

    Zaveďme koncept diskretizačního kroku Δ 1 vzhledem k prostorové proměnné X 1 a A 2 proměnnou X 2. Lze si to například představit u bodů vzdálený přítel od sebe ve vzdálenosti Δ 1 podél osy X Jsou umístěny 1 bodové video senzory. Pokud jsou takové video senzory instalovány po celé obdélníkové oblasti, bude obraz dán na dvourozměrné mřížce

    Pro zkrácení zápisu označujeme

    Funkce F(n 1 , n 2) je funkcí dvou diskrétních proměnných a nazývá se dvourozměrná posloupnost. To znamená, že diskretizace obrazu z hlediska prostorových proměnných jej převede do tabulky vzorových hodnot. Rozměr tabulky (počet řádků a sloupců) je určen geometrickými rozměry původní obdélníkové plochy a volbou kroku diskretizace podle vzorce

    Kde hranaté závorky[…] označuje celočíselnou část čísla.

    Je-li doménou souvislého obrazu čtverec L 1 = L 2 = L a krok vzorkování je zvolen tak, aby byl stejný podél os X 1 a X 2 (A 1 = A 2 = Δ), pak

    a rozměr stolu je N 2 .

    Prvek tabulky získaný vzorkováním obrázku se nazývá " pixel" nebo " Odpočítávání". Zvažte pixel F(n 1 , n 2). Toto číslo nabývá spojitých hodnot. Paměť počítače může ukládat pouze diskrétní čísla. Pro záznam v paměti tedy spojitá hodnota F musí být podroben analogově-digitální převod s krokem D F(viz obrázek 3.2).

    Obrázek 3.2 - Kvantování spojité veličiny

    Často se nazývá operace analogově-digitální konverze (diskretizace spojité hodnoty podle úrovně). kvantování. Počet kvantizačních úrovní za předpokladu, že hodnoty jasové funkce leží v intervalu _____ _ ____ ___, je roven

    V praktických problémech zpracování obrazu hodnota Q se značně liší od Q= 2 ("binární" nebo "černobílé" obrázky). Q= 210 nebo více (prakticky spojité hodnoty jasu). Nejčastěji se volí Q= 28, zatímco obrazový pixel je zakódován jedním bajtem digitálních dat. Ze všeho výše uvedeného usuzujeme, že pixely uložené v paměti počítače jsou výsledkem diskretizace původního spojitého obrazu z hlediska argumentů (souřadnic?) a úrovní. (Kde a kolik a vše je diskrétní) Je jasné, že diskretizační kroky Δ 1 , Δ 2 by měl být zvolen dostatečně malý, aby vzorkovací chyba byla zanedbatelná a digitální zobrazení si zachovalo základní informace o snímku.

    Zároveň je třeba připomenout, že čím menší je krok vzorkování a kvantování, tím větší množství obrazových dat je nutné zaznamenat do paměti počítače. Jako ilustraci tohoto tvrzení uvažujme obrázek na diapozitivu 50×50 mm, který se zadává do paměti pomocí digitální měřič optická hustota (mikrorodenzitometr). Pokud je na vstupu lineární rozlišení mikrodenzitometru (krok vzorkování z hlediska prostorových proměnných) 100 mikronů, pak je paměť zapsána dvourozměrné pole rozměrových pixelů N 2 = 500 × 500 = 25∙10 4 . Pokud se krok zmenší na 25 mikronů, pak se velikost pole zvětší 16krát a bude N 2 = 2000×2000 = 4∙106. Pomocí kvantizace o 256 úrovní, tedy zakódování nalezeného pixelu po bytech, dostaneme, že v prvním případě je pro záznam potřeba 0,25 megabajtů paměti a ve druhém případě 4 megabajty.

    Obrazy sestávající z diskrétních prvků, z nichž každý může mít pouze konečný počet rozlišitelných hodnot, které se mění v konečném čase, se nazývají diskrétní. Je třeba zdůraznit, že prvky diskrétního obrazu mohou mít obecně nestejnou plochu a každý z nich může mít nestejný počet rozlišitelných gradací.

    Jak bylo ukázáno v první kapitole, sítnice přenáší diskrétní obrazy do vyšších částí vizuálního analyzátoru.

    Jejich zdánlivá kontinuita je pouze jednou z iluzí oka. Tato "kvantizace" původně spojitých obrazů není určena omezeními, která jsou spojena s rozlišením optický systém oči a ani ne morfologické strukturní prvky zrakového systému, ale funkční organizace nervových sítí.

    Obraz je rozdělen na diskrétní prvky pomocí receptivních polí, která kombinují jeden nebo jiný počet fotoreceptorů. Přijímací pole vytvářejí primární výběr užitečných světelný signál prostorovým a časovým sčítáním.

    Centrální část sítnice (foveu) zaujímají pouze čípky, na periferii mimo foveu jsou čípky i tyčinky. V podmínkách nočního vidění mají kuželová pole ve střední části sítnice přibližně stejnou velikost (asi 5 "v úhlové míře). Počet takových polí ve fovee, jejíž úhlové rozměry jsou asi 90", je asi 200. Hlavní roli v podmínkách nočního vidění hrají tyčová pole, která zabírají zbytek povrchu sítnice. Mají úhlovou velikost asi 1° po celém povrchu sítnice. Počet takových polí na sítnici je asi 3 000. Nejen detekci, ale i zkoumání slabě osvětlených předmětů za těchto podmínek provádějí periferní oblasti sítnice.

    S nárůstem osvětlení začíná hrát hlavní roli další systém zásobních buněk, kuželová receptivní pole. Ve fovee způsobuje zvýšení osvětlení postupné snižování efektivní intenzity pole, až se při jasu asi 100 asb sníží na jeden kužel. Na periferii se s rostoucím osvětlením postupně vypínají (zpomalují) tyčová pole a vstupují do činnosti kuželová pole. Kuželová pole na periferii, stejně jako foveální, mají schopnost klesat v závislosti na světelné energii dopadající na ně. Největší početčípků, které mohou mít čípková receptivní pole s rostoucím osvětlením, roste od středu k okrajům sítnice a v úhlové vzdálenosti 50-60° od středu dosahuje přibližně 90.

    Lze spočítat, že za podmínek dobrého denního světla dosahuje počet receptivních polí asi 800 tis.. Tato hodnota přibližně odpovídá počtu vláken v lidském zrakovém nervu. Rozlišování (rozlišování) objektů v denním vidění se provádí především ve fovee, kde lze receptivní pole redukovat na jeden čípek a samotné čípky jsou umístěny nejhustěji.

    Zatímco počet zásobních buněk v sítnici lze určit s uspokojivou aproximací, stále není dostatek údajů pro určení počtu možných stavů receptivních polí. Na základě studia diferenciálních prahů receptivních polí lze provést pouze některé odhady. Prahový kontrast ve foveálních receptivních polích v určitém provozním rozsahu osvětlení je řádově 1. V tomto případě je počet rozlišitelných gradací malý. V celém rozsahu přeskupení čípkového foveálního receptivního pole se liší 8-9 gradací.

    Doba akumulace v receptivním poli - tzv. kritické trvání - je určena v průměru hodnotou řádově 0,1 sec., ale při vysoké úrovně osvětlení může být zjevně výrazně sníženo.

    Ve skutečnosti model popisující diskrétní strukturu přenášené obrázky, by mělo být ještě obtížnější. Bylo by nutné vzít v úvahu vztah mezi dimenzemi receptivního pole, prahy a kritickou dobou trvání, stejně jako statistickou povahu zrakových prahů. Zatím to ale není nutné. Stačí si představit jako obrazový model soubor plošně shodných prvků, jejichž úhlové rozměry jsou menší než úhlové rozměry nejmenšího detailu rozlišitelného okem, jejichž počet rozlišitelných stavů je větší než maximální počet rozlišitelné gradace jasu, přičemž doba diskrétní změny je kratší než perioda blikání při kritické frekvenci fúze blikání.

    Pokud jsou obrazy skutečných spojitých objektů vnějšího světa nahrazeny takovými diskrétními obrazy, oko si substituce nevšimne.* Proto diskrétní obrazy tohoto druhu obsahují alespoň tolik informací, kolik vnímá zrakový systém. **

    * Barevné a objemové obrázky lze také nahradit diskrétním modelem.
    ** Problém nahrazování spojitých obrazů diskrétními je pro filmovou a televizní techniku ​​velmi důležitý. Kvantování času je jádrem této techniky. V systémech pulzně kódované televize je obraz také rozdělen na diskrétní prvky a kvantován podle jasu.

    Digitální fotografie nebo jinak bitmapa je pole čísel zachycených snímači úrovně jasu ve dvourozměrné rovině. S vědomím, že z matematického hlediska tenká čočka provádí Fourierovu transformaci obrazů umístěných v ohniskových rovinách, je možné vytvořit algoritmy zpracování obrazu, které jsou analogické zpracování obrazu klasického optického systému.

    Vzorec takových algoritmů bude vypadat takto:

    1. Z=FFT(X) – přímá dvourozměrná Fourierova transformace
    2. Z′=T(Z) – aplikace funkce nebo průhlednosti na Fourierův obraz obrázku
    3. Y=BFT(Z′) – inverzní dvourozměrná Fourierova transformace
    Fourierovy transformace jsou vypočítávány pomocí rychlých diskrétních algoritmů Fourierovy transformace. Optický systém čoček sice provádí Fourierovu transformaci na spojitém rozsahu argumentu a pro spojité spektrum, ale při přechodu na digitální zpracování dat, vzorce Fourierovy transformace mohou být nahrazeny vzorcem pro diskrétní Fourierovu transformaci.

    Příklady implementace

    • Algoritmus rozostření obrazu
    Implementované algoritmy jsou součástí open source knihovny. zdrojový kód FFTTools. Internetová adresa: github.com/dprotopopov/FFTTools

    Algoritmus rozostření obrazu

    V optických systémech je clona umístěná v ohniskové rovině jednoduchým otvorem v obrazovce. V důsledku procházení světelný tok přes membránu procházejí vysokofrekvenční vlny (s kratšími vlnovými délkami) překážkou a vlny nízké frekvence(s delšími vlnovými délkami) jsou oříznuty obrazovkou. Tím se zlepší ostrost výsledného obrazu. Pokud díru v obrazovce nahradíme překážkou v obrazovce, pak bude výsledek rozmazaný obraz, protože bude tvořen z frekvencí vln velkých délek.

    Algoritmus:

    1. Vypočítejte pole Z′=T(Z), kde T je vynulování řádků a sloupců umístěných v daných vnitřních oblastech matice-argument odpovídající vysokým frekvencím 5. (tj. vynulování Fourierových expanzních koeficientů odpovídajících na vysoké frekvence)

    Algoritmus ostření obrazu

    V optických systémech je clona umístěná v ohniskové rovině jednoduchým otvorem v obrazovce. V důsledku průchodu světelného toku přes clonu procházejí vysokofrekvenční vlny (s kratšími vlnovými délkami) překážkou a nízkofrekvenční vlny (s delšími vlnovými délkami) jsou stíněním odříznuty. Tím se zlepší ostrost výsledného obrazu.

    Algoritmus:

    1. Nechť X(N1,N2) je pole jasů obrazových bodů.
    2. Vypočítejte Px = střední (efektivní) jas pixelů v poli X
    3. Vypočítat pole Z=FT(X) - přímá dvourozměrná diskrétní Fourierova transformace
    4. Uložte hodnotu L=Z(0,0) - odpovídající průměrnému jasu pixelů v původním obrázku
    5. Vypočítejte pole Z′=T(Z), kde T je vynulování řádků a sloupců umístěných v daných vnějších oblastech matice argumentů odpovídajících nízkým 6. frekvencím (tj. vynulování koeficientů Fourierovy expanze odpovídající nízké frekvence)
    6. Obnovte hodnotu Z'(0,0)=L - odpovídající průměrnému jasu pixelů původního obrázku
    7. Vypočítat pole Y=RFT(Z′) – inverzní 2D diskrétní Fourierova transformace
    8. Vypočítejte Py = střední (efektivní) jas pixelů v poli Y
    9. Normalizujte pole Y(N1,N2) podle průměrné úrovně jasu Px/Py

    Algoritmus změny velikosti obrazu

    V optických systémech je světelný tok v ohniskové rovině systému Fourierovou transformací původního obrazu. Velikost obrazu získaného na výstupu optické soustavy je dána poměrem ohniskových vzdáleností objektivu a okuláru.

    Algoritmus:

    1. Nechť X(N1,N2) je pole jasů obrazových bodů.
    2. Vypočítejte Px = střední (efektivní) jas pixelů v poli X
    3. Vypočítat pole Z=FT(X) - přímá dvourozměrná diskrétní Fourierova transformace
    4. Vypočítejte pole Z′=T(Z), kde T buď sečte nula řádků a sloupců matice odpovídající vysokým frekvencím, nebo vymaže řádky a sloupce matice odpovídající vysokým frekvencím, abyste získali požadovanou velikost konečného obrázku.
    5. Vypočítat pole Y=RFT(Z′) – inverzní 2D diskrétní Fourierova transformace
    6. Vypočítejte Py = střední (efektivní) jas pixelů v poli Y
    7. Normalizujte pole Y(M1,M2) podle průměrné úrovně jasu Px/Py
    Použitý software
    • Microsoft vizuální studio 2013 C# - prostředí a programovací jazyk
    • EmguCV/OpenCV - C + + knihovna struktur a algoritmů pro zpracování obrazu
    • FFTWSharp/FFTW – C++ knihovna implementující rychlé diskrétní algoritmy Fourierovy transformace

    Algoritmus rozostření obrazu

    Kód algoritmu

    ///

    /// Vymazat vnitřní oblast pole /// /// Pole hodnot /// Velikost oblasti vnitřní slepé private static void Blind(Complex[,] data, Size size) ( int n0 = data.GetLength(0); int n1 = data.GetLength(1); int n2 = data.GetLength(2); int s0 = Math. Max(0, (n0 - velikost.Výška)/2); int s1 = Math.Max(0, (n1 - velikost.Šířka)/2); int e0 = Math.Min((n0 + velikost.Výška)/ 2, n0); int e1 = Math.Min((n1 + velikost.Šířka)/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); } } /// /// Rozostření bitmapy s nejrychlejší Fourierovou transformací /// /// Rozmazaná bitmapa public Bitmap Blur (Bitmap bitmap) ( pomocí (var image = new Image (bitmapa)) ( 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 input = new fftw_complexarray(doubles.Select(x => new Complex(x, 0)).ToArray()); var output = new fftw_complexarray(length); fftw_plan.dft_3d(n0, n1, n2, vstup, výstup, fftw_direction. Forward, fftw_flags.Estimate).Execute(); komplexní komplex= output.GetData_Complex(); var data = new Complex; varbuffer = nový dvojitý; GCHandle complexHandle = GCHandle.Alloc(komplex, GCHandleType.Pinned); GCHandle dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr complexPtr = complexHandle.AddrOfPinnedObject(); IntPtr dataPtr = dataHandle.AddrOfPinnedObject(); Marshal.Copy(complexPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, dataPtr, buffer.Length); Blind(data, _blinderSize); Marshal.Copy(dataPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, complexPtr, buffer.Length); complexHandle.Free(); dataHandle.Free(); input.SetData(komplex); fftw_plan.dft_3d(n0, n1, n2, vstup, výstup, fftw_direction.Backward, fftw_flags.Estimate).Execute(); double array2 = output.GetData_Complex().Select(x => x.Magnitude).ToArray(); double power2 = Math.Sqrt(pole2.Average(x => x*x)); doubles = pole2.Select(x =>

    Algoritmus ostření obrazu

    Kód algoritmu

    ///

    /// Vymazat externí oblast pole /// /// Pole hodnot /// Velikost vnější slepé oblasti private static void Blind(Complex[,] data, Size size) ( int n0 = data.GetLength(0); int n1 = data.GetLength(1); int n2 = data.GetLength(2); int s0 = Math. Max(0, (n0 - velikost.Výška)/2); int s1 = Math.Max(0, (n1 - velikost.Šířka)/2); int e0 = Math.Min((n0 + velikost.Výška)/ 2, n0); int e1 = Math.Min((n1 + velikost.Šířka)/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); } } /// /// Ostrá bitmapa s nejrychlejší Fourierovou transformací /// /// zaostřená bitmapa public Bitmap Sharp (bitmapa bitmap) ( pomocí (var image = nový obrázek (bitmapa)) ( 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 input = new fftw_complexarray(doubles.Select(x => new Complex(x, 0)).ToArray()); var output = new fftw_complexarray(length); fftw_plan.dft_3d(n0, n1, n2, vstup, výstup, fftw_direction. Forward, fftw_flags.Estimate).Execute(); Complex complex = output.GetData_Complex(); Complex level = complex; var data = new Complex; var buffer = new double; GCHandle complexHandle = GCHandle.Alloc(komplex, GCHandleType.Pinned) ; GCHandle dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr complexPtr = complexHandle.AddrOfPinnedObject(); IntPtr dataPtr = dataHandle.AddrOfPinnedObject(); Marshal.Copy(complexPtr, bufferL, 0); Copy(buffer, 0, dataPtr, buffer.Length); Blind(data, _blinderSize); Marshal.Copy(dataPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, complexPtr, buffer.Length); complexHandle.Free(); dataHandle.Free(); komplex = úroveň; input.SetData(komplex); fftw_plan.dft_3d(n0, n1, n2, vstup, výstup, fftw_direction.Backward, fftw_flags.Estimate).Execute(); double array2 = output.GetData_Complex().Select(x => x.Magnitude).ToArray(); double power2 = Math.Sqrt(pole2.Average(x => x*x)); doubles = pole2.Select(x => x*výkon/výkon2).ToArray(); Buffer.BlockCopy(doubles, 0, image.Data, 0, length*sizeof (double)); vrátit obrázek.Bitmapa; ))

    Algoritmus změny velikosti obrazu

    Kód algoritmu

    ///

    /// Kopírovat pole /// /// vstupní pole /// výstupní pole private static void Copy(Complex[,] input, Complex[,] output) ( 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; } } } } /// /// Změna velikosti bitmapy pomocí nejrychlejší Fourierovy transformace /// /// Změněná velikost bitmapy public Bitmap Stretch (bitmapa bitmap) ( pomocí (var image = nový obrázek (bitmapa)) ( 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 input = new fftw_complexarray(doubles.Select(x => new Complex(x, 0)).ToArray()); var output = new fftw_complexarray(length); fftw_plan.dft_3d(n0, n1, n2, vstup, výstup, fftw_direction. Forward, fftw_flags.Estimate).Execute(); Komplexní komplex = výstup.GetData_Complex(); pomocí (var image2 = nový obrázek (_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 = nový komplex; var data = nový komplex; var data2 = nový komplex; var buffer = new double; GCHandle complexHandle = GCHandle.Alloc(komplex, GCHandleType.Pinned); GCHandle dataHandle = GCHandle.Alloc(data, GCHandleType .Pinned ); IntPtr complexPtr = complexHandle.AddrOfPinnedObject(); IntPtr dataPtr = dataHandle.AddrOfPinnedObject(); Marshal.Copy(complexPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, dataPtr, buffer.Leng ); complexHandle.Free(); dataHandle.Free(); Copy(data, data2); buffer = new double; 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, buffer.Length); complexHandle.Free(); dataHandle.Free(); var input2 = new fftw_complexarray(complex2); var output2 = new fftw_complexarray(length2); fftw_plan.dft_3d(m0, m1, m2, vstup2, výstup2, fftw_direction.Backward, fftw_flags.Estimate).Execute(); double array2 = output2.GetData_Complex().Select(x => x.Magnitude).ToArray(); double power2 = Math.Sqrt(pole2.Average(x => x*x)); double doubles2 = pole2.Select(x => x*výkon/výkon2).ToArray(); Buffer.BlockCopy(doubles2, 0, image2.Data, 0, length2*sizeof (double)); return image2.Bitmap; )))