• Interpolace digitálního obrazu. Levná interpolační metoda funguje stejně dobře jako neuronové sítě

    Nastavení vlastností zobrazení

    V aplikaci Image Processing Toolbox můžete nastavit předvolby, které řídí určité vlastnosti funkcí zobrazení obrazu imshow a imtool. Použití nastavení aplikace vám například umožňuje popsat faktor zvětšení, který se použije při zobrazování obrázků pomocí funkcí imtool a imshow.

    V rámci Tento problém zvážit

    • Seznam nastavení podporovaných aplikací.
    • Popisuje, jak získat aktuální hodnoty nastavení pomocí funkce iptgetpref.
    • Popisuje, jak nastavit aktuální předvolby pomocí funkce iptsetpref.

    Nastavení aplikace

    Image Processing Toolbox podporuje několik nastavení, která ovlivňují způsob zobrazení obrázků pomocí funkcí imshow a imtool. V tabulce jsou uvedena nastavení a jejich krátký popis. Více detailní informace nastavení aplikace a jejich význam viz popis funkce iptsetpref.

    Nastavení aplikace Popis
    ImshowBorder Tento parametr může nabývat dvou hodnot - "volný" a "těsný". Pokud je parametr ImshowBorder nastaven na "loose", pak se obrázek zobrazí pomocí funkce imshow, odsazený od okraje okna obrázku. V okně tak vzniká prostor pro další nápisy. Používá se ve výchozím nastavení. Pokud je parametr ImshowBorder nastaven na "tight", pak se obrázek zobrazí funkcí imshow tak, aby vyplnil celé okno obrázku.
    ImshowAxesVisible Tento parametr může nabývat dvou hodnot - "on" a "off". Pokud parametr ImshowAxesVisible nabývá hodnoty "on", pak při zobrazení obrázku funkcí imshow se v okně obrázku navíc zobrazí souřadné osy. Pokud parametr ImshowAxesVisible převezme hodnotu "off", pak se souřadné osy nezobrazí. Hodnota parametru "off" je standardně nastavena.
    ImshowInitialMagnification Řídí faktor zvětšení použitý funkcí imshow při zobrazení obrázku.
    ImtoolInitialMagnification Řídí faktor zvětšení v nástroji Obrázek, který se používá ke změně měřítka obrázků.

    Načítání hodnot nastavení aplikace

    K určení aktuálních hodnot se používá funkce iptgetpref. Podívejme se na příklad použití funkce iptgetpref k určení hodnoty vlastnosti imtoolInitialMagnification.

    Iptgetpref("ImtoolInitialMagnification") ans = 100

    Další informace naleznete v popisu funkce iptgetpref.

    Nastavení hodnot vlastností aplikace

    Funkce iptsetpref se používá k nastavení hodnot vlastností aplikace. Podívejme se na příklad použití funkce iptsetpref pro nastavení vlastností zobrazení, které způsobí změnu velikosti okna zobrazení podle velikosti zobrazeného obrázku a hodnoty vlastnosti "ImshowBorder" při volání funkce imshow.

    Iptsetpref("ImshowBorder", "těsný");

    Další informace naleznete v popisu funkce iptsetpref.

    Prostorové transformace

    Podívejme se na hlavní funkce prostorových transformací, které jsou implementovány v aplikaci Image Processing Toolbox.

    Terminologie Popis hlavních pojmů, které se používají při zpracování obrazu
    Interpolace Prostorová (nebo dočasná) predikce neznámých hodnot pixelů mezi skutečnými hodnotami pixelů.
    Změna velikosti obrázku pomocí funkce imresize.
    Otočení obrazu Použití funkce imrotate k otočení obrázků.
    Vyříznutí obrázku Použití funkce imcrop k oříznutí obdélníkové části obrázku.
    Popis hlavních vlastností prostorových transformací v aplikaci.

    Interpolace

    Jak bylo uvedeno výše, interpolace je prostorová (nebo časová) predikce neznámých hodnot pixelů mezi skutečnými hodnotami pixelů. Například jedna z interpolačních metod se používá ke změně velikosti obrázků. Metody 2D interpolace se také používají při otáčení snímků (funkce imrotate) a při analýze snímků pomocí funkce improfile.

    Interpolační metody

    Image Processing Toolbox používá tři vestavěné interpolační algoritmy:

    • Interpolace na nejbližší soused – používá hodnotu nejbližšího pixelu.
    • Bilineární interpolace – používá interpolaci podél bilineární plochy.
    • Bikubická interpolace - používá se interpolace na bikubické ploše.

    Typy obrázků

    Ve funkcích, které používají interpolaci, je jako argument uveden název metody interpolace. U většiny funkcí se jedná o interpolaci pomocí nejbližších hodnot pixelů. Tato metoda poskytuje přijatelné výsledky pro všechny typy obrázků a je jedinou metodou používanou pro indexové obrázky. Pro jasové a RGB obrazy je lepší použít bilineární nebo bikubickou interpolaci, protože ve většině případů tyto metody poskytují lepší výsledek než použití interpolace pomocí hodnoty nejbližších pixelů.

    U obrázků RGB se interpolace provádí samostatně pro červenou, zelenou a modrou složku. V zásadě to není zcela správné, protože to vede k porušení vyvážení barev.

    U binárních obrazů bude mít interpolace účinek, pokud je prováděna vědomě. Při použití bilineární nebo bikubické interpolace se vypočítané hodnoty pixelů ve výsledném obrázku nebudou vždy rovnat 0 nebo 1. Výsledek zpracování závisí také na formátu původního obrázku:

    • Pokud jsou data zdrojového obrázku ve dvojitém formátu, bude výsledný obrázek ve stupních šedi a bude reprezentován ve dvojitém formátu. Výsledný obrázek tedy nebude binární, protože obsahuje hodnoty mezi 0 a 1.
    • Pokud je zdrojový obrázek ve formátu uint8, bude výsledný obrázek binární a reprezentovaný ve formátu uint8. Interpolované hodnoty pixelů budou zaokrouhleny na 0 a 1 a výsledný obrázek bude ve formátu uint8.

    Při použití interpolace pomocí hodnot nejbližších pixelů bude výsledek vždy binární, protože hodnoty interpolovaných pixelů jsou převzaty z původního obrázku.

    Změna velikosti obrázku

    Funkce imresize se používá ke změně velikosti obrázku. Při použití funkce imresize musíte

    • Popište velikost výsledného obrázku.
    • Popište vybranou metodu interpolace.
    • Popište filtr přípravy obrazu.

    Při použití funkce imresize lze velikost výsledného obrázku určit dvěma způsoby:

    • prostřednictvím popisu faktoru zvětšení.
    • prostřednictvím popisu rozměrů výsledného obrázku.

    Pomocí faktoru zvětšení

    Pro zvětšení obrázku musí být faktor zvětšení větší než 1. Pro zmenšení obrázku musí být faktor zvětšení v rozsahu mezi 0 a 1. Například pomocí níže uvedeného příkazu je zvětšení obrázku I realizováno 1,25krát.

    I = imread("obvod.tif"); J = velikost velikosti (I,1,25); imshow(I) postava, imshow(J)

    Popis velikosti výsledného obrázku

    Velikost výsledného obrázku je možné popsat jako vektor, který obsahuje dvě čísla – počet řádků a sloupců výsledného obrázku. Podívejme se na příklad vytvoření výsledného obrázku Y, který se skládá ze 100 řádků a 150 sloupců.

    Y = imresize(X,)

    Poznámka. Pokud při popisu rozměrů výsledného obrázku není zachován poměr stran původního obrázku, bude výsledný obrázek zkreslený.

    Popis interpolační metody

    Ve výchozím nastavení používá funkce imresize k vytvoření výsledného obrázku metodu interpolace založenou na hodnotách nejbližších pixelů. Můžete však zadat i jinou metodu interpolace. Tabulka obsahuje seznam voleb, které nastavují metody interpolace ve funkci imresize.

    Zvažte příklad, kdy funkce imresize používá bi lineární interpolace.

    Y = imresize(X,,"bilineární")

    Použití filtrů pro přípravu obrazu

    Změna velikosti obrázku může způsobit, že se v obrázku objeví artefakty, které ovlivňují kvalitu obrázku.

    Proto při zmenšování obrázků pomocí bilineární nebo bikubické interpolace funkce imresize automaticky používá nízkoprůchodový filtr k redukci artefaktů ve výsledném obrázku.

    Funkce imresize nemusí použít dolní propust, pokud je použita sousedská interpolace. Sousední interpolace se používá hlavně pro indexové obrazy a nízkoprůchodové filtrování se nepoužívá pro indexové obrazy.

    Můžete si také vytvořit svůj vlastní filtr pro nízkoprůchodové filtrování. Další podrobnosti naleznete v popisu funkce imresize.

    Otočte obrázky

    Funkce imrotate slouží k otáčení obrázků. Při použití funkce imrotate musíte zadat dva hlavní argumenty:

    1. obrázek, který se má otočit;
    2. úhel natočení.

    Úhel natočení lze popsat ve stupních. Pokud je nastavena na kladnou hodnotu, funkce imrotate otočí snímek proti směru hodinových ručiček, pokud je nastavena na zápornou hodnotu, funkce imrotate otočí snímek ve směru hodinových ručiček. Zvažte příklad otočení obrázku I o 35 stupňů proti směru hodinových ručiček.

    J = imrotát (1,35);

    Jako volitelné argumenty ve funkci imrotate můžete také popsat

    1. interpolační metoda;
    2. velikost výsledného obrázku.

    Popis interpolační metody

    Ve výchozím nastavení používá funkce imrotate sousedskou interpolaci k určení hodnot pixelů výsledného obrázku. Uživatel může také použít jinou metodu interpolace. Tabulka obsahuje seznam podporovaných metod interpolace.

    Zvažte příklad otočení obrázku o 35° proti směru hodinových ručiček pomocí bilineární interpolace.

    I = imread("obvod.tif"); J = imrotate(I,35"bilineární"); imshow(I) postava, imshow(J)

    Popis velikosti výsledného obrázku

    Ve výchozím nastavení funkce imrotate vytvoří větší výsledek, takže původní obrázek je umístěn pod zadaným úhlem. Pixely, které jsou mimo obrázek, jsou nastaveny na 0 a jsou pozadím výsledného obrázku. Pokud ve funkci imrotate zadáte jako argument možnost "oříznout", pak se výsledný obrázek ořízne na velikost původního obrázku. Další informace naleznete v popisu funkce imrotate.

    Řezání obrázků

    Funkce imcrop se používá k výběru obdélníkové části obrázku. Při použití funkce imcrop je třeba zadat dva hlavní argumenty:

    1. originální obrázek;
    2. souřadnice obdélníku, který definuje oblast řezu.

    Existuje také další způsob použití funkce imcrop. Spočívá v tom, že není vždy nutné specifikovat obdélník, který je na obrázku vyříznut. Tento obdélník lze nastavit interaktivně. V tomto případě kurzor změní svůj vzhled a bude mít podobu kříže. Stisknutí levého tlačítka myši indikuje výběr jednoho rohu obdélníku a poloha kurzoru v okamžiku uvolnění tlačítka myši indikuje výběr jiného rohu. Na horní stranu obrázku bude tedy překryt obdélník, který určuje vyříznutou část obrázku.

    Imshow circuit.tif I = imcrop; imshow(I);

    Proveďte základní prostorové transformace

    Funkce imtransform se používá k provádění základních 2D prostorových transformací.

    Při použití funkce imtransform musíte zadat dva hlavní argumenty:

    • originální obrázek;
    • prostorová transformační struktura (TFORM), která definuje typ transformací, které mají být provedeny.

    Popis typu transformace

    Při popisu typu transformací je nutné použít strukturu TFORM. TFORM lze použít dvěma způsoby:

    • pomocí funkce maketform;
    • pomocí funkce cp2tform.

    Pomocí maketformu

    Při použití funkce maketform musíte popsat typ požadovaných převodů. V tabulce jsou uvedeny typy transformací v abecední pořadí, který je podporován funkcí maketform.

    Typ konverze Popis
    "afinní" Transformace, které zahrnují translaci, rotaci, změnu měřítka a další podobné funkce transformace obrazu. V tomto případě rovné čáry zůstávají rovné, rovnoběžné čáry zůstávají rovnoběžné a obdélník se může změnit na rovnoběžník.
    "box" Speciální případ afinních transformací, kde každá dimenze měří nezávisle.
    "kompozitní" Struktura dvou nebo více transformací.
    "Zvyk" Transformace, která je definována uživatelem a volána pomocí funkce imtransform.
    "projektivní" U tohoto typu transformace zůstávají přímky rovné, zatímco rovnoběžné čáry se sbíhají v jednom bodě. Tento bod může být uvnitř obrázku nebo mimo něj.

    Pomocí cp2tform

    Při použití funkce cp2tform se TFORM vygeneruje, když je třeba provést transformace, jako je přizpůsobení dat, jako jsou polynomiální transformace.

    Poznámka. Při použití imtransformační funkce provádí struktura TFORM 2D prostorovou transformaci. Pokud obrázek obsahuje více než dva rozměry, jako je obrázek RGB, pak se 2D transformace automaticky aplikují na všechny 2D komponenty. Funkce tformarray se používá k definování n-rozměrných transformací.

    Provádění transformací

    Po definování typu transformací ve struktuře TFORM je možné je provést voláním funkce imtransform.

    Zvažte příklad použití funkce imtransform k provádění projektivních transformací na obrázku šachovnice.

    I = šachovnice(20,1,1); postavy; imshow(I) T = maketform("projektivní",,... ); R = makeresampler("kubický","kruhový"); K = imtransformace(I,T,R,"Velikost",,"XYScale",1); postava, imshow (K)

    Různé možnosti imtransformační funkce řídí různé aspekty transformací. Například, jak je vidět z předchozí transformace, individuální instalace musí řídit počet a umístění kopií původního obrázku ve výsledném obrázku. Řídí se také velikost výsledného obrázku. V aplikaci Image Processing Toolbox je několik příkladů, které používají funkci imtransform a další podobné funkce, které provádějí Různé typy prostorové proměny.

    Lineární filtrace a návrh filtrů

    Aplikace Image Processing Toolbox obsahuje řadu funkcí, které navrhují a implementují 2D lineární filtrování obrazových dat. Zvažte tyto otázky v tomto pořadí:

    Zvažte některé další termíny, které budou také použity v budoucnu při zvažování materiálu.

    Období Popis
    Konvoluce (konvoluce) Operace na místním sousedství, kde každý výsledný pixel je váženým součtem původních pixelů. Hmotnost je určena konvolučním jádrem. Pomocí operace konvoluce můžete implementovat metody zpracování obrazu, jako je vyhlazení, doostření a zvýraznění okrajů obrazových objektů.
    konvoluční jádro (konvoluční jádro) Hmotnostní matice, která se používá při provádění konvoluce.
    korelace (korelace) Operace v místním sousedství, kde každý výsledný pixel je váženým součtem pixelů v místním sousedství. Váhy jsou určeny korelačním jádrem. Pojem korelace velmi úzce souvisí s pojmem konvoluce.
    korelační jádro (korelační jádro) Pro implementaci korelační funkce se používá váhová funkce. Korelační jádra lze získat pomocí funkce návrhu filtru v nástroji Image Processing Toolbox. Korelační jádra jsou konvoluční jádro, které je otočeno o 180 stupňů.
    FIR filtr (filtr s konečným impulsní odezva, FIR filtr) Aplikace má řadu funkcí pro výpočet koeficientů digitálního FIR filtru, zejména metodu Remez. Charakteristickým rysem jejich použití je, že výchozí údaje jsou uvedeny ve formě požadované frekvenční charakteristiky libovolné složitosti.
    frekvenční odezva ( frekvenční odezva nebo frekvenční odezva) Matematická funkce, kterou lze použít k vyhodnocení výkonu filtru na různých frekvencích.
    operace sousedství (operace využívající hodnoty sousedních prvků) Operace, která vypočítá hodnotu každého pixelu na základě hodnot okolních pixelů. Konvoluce, metody morfologického zpracování a střední filtrování jsou příklady operací využívajících sousední pixely.
    metoda okna (místní metody zpracování) Metody zpracování, které berou v úvahu místní vlastnosti obrázku.

    Lineární filtrování

    Filtrování je technologie pro úpravu nebo vylepšení obrazu. Například existuje velký počet filtry pro vylepšení nebo odstranění určitých funkcí obrázku. Můžeme se bavit o zvýraznění okrajů, zvýrazňování oblastí podle některých vlastností (například barvy) atp.

    Jak bylo uvedeno výše, existuje řada metod, ve kterých se hodnoty pixelů zpracovávaného obrázku počítají na základě hodnot okolních pixelů. Rozdíl mezi těmito metodami je v tom, jak jsou zohledněny hodnoty sousedních pixelů. Všimněte si, že na základě hodnot sousedních pixelů můžeme mluvit o vlastnostech místních sousedství obrázku.

    Lineární filtrování je typ zpracování, při kterém se hodnoty pixelů zpracovávaného obrázku tvoří jako výsledek lineárních operací s hodnotami pixelů v okolí původního obrázku.

    Vzhledem k tomu, že tento typ filtrování se při zpracování obrazu poměrně často používá, zamysleme se nad některými otázkami. lineární filtrování podrobněji, zejména

    • Filtrování pomocí konvoluce a korelace.
    • Provádění filtrování pomocí funkce imfilter atd.

    Konvoluce

    Lineární filtrování obrazu lze realizovat pomocí tzv. operace konvoluce. Když je tato operace implementována, hodnoty výsledných pixelů se vypočítají jako vážený součet pixelů v původním obrázku. Hmotnostní matice se nazývá konvoluční jádro, známé také jako filtr.

    Zvažte příklad. Nechť obrázek je sada pixelů s hodnotami reprezentovanými jako matice

    A=

    a konvoluční jádro je reprezentováno následovně

    H=

    Zvažte příklad výpočtu výsledného pixelu se souřadnicemi (2,4). Chcete-li to provést, postupujte takto:

    1. Otočte konvoluční jádro o 180 stupňů vzhledem k centrálnímu prvku.
    2. Vynásobte každou hodnotu hmotnosti v konvoluční matici odpovídající hodnotou pixelu v matici A.
    3. Sečtěte výsledek násobení.


    Korelace

    Korelační operace je z hlediska implementace velmi podobná operaci konvoluce. Při výpočtu korelace je hodnota výsledného pixelu váženým součtem okolních pixelů. Rozdíl je v tom, že matice hmotnosti se před výpočty neotáčí. Zvažte podobný příklad výpočtu hodnoty výsledného pixelu (2,4). Původní obrazová matice a korelační jádro jsou převzaty z předchozího příkladu. Chcete-li to provést, musíte provést následující kroky:

    1. Každou hodnotu hmotnosti vynásobíme odpovídající hodnotou prvku matice původního obrázku.
    2. Shrneme všechny výsledky násobení, které byly získány v odstavci 1.

    V důsledku toho bude hodnota pixelu (2,4) rovna


    Výpočet hodnoty výsledného pixelu (2,4)

    Proč obrázek zmenšený pomocí bikubické interpolace vypadá jinak než ve Photoshopu. Proč jeden program změní velikost rychle a druhý ne, ačkoli výsledek je stejný. Která metoda změny velikosti je nejlepší pro zvýšení a která pro snížení. Co filtry dělají a jak se liší.

    Obecně to byl úvod k jinému článku, ale protáhl se a vyústil v samostatný materiál.

    Tato osoba sedí mezi kopretinami, aby vás upozornila na článek.

    Pro vizuální srovnání použiji obrázky stejného rozlišení 1920x1280 (jedna, druhá), z čehož vyplynou velikosti 330x220, 1067x667 a 4800x3200. Pod ilustracemi bude napsáno, kolik milisekund trvala změna velikosti na konkrétní rozlišení. Čísla jsou uvedena pouze pro pochopení složitosti algoritmu, takže konkrétní hardware nebo software, na kterém byly získány, není tak důležitý.

    Nejbližší soused

    Toto je nejprimitivnější a rychlá metoda. Pro každý pixel konečného obrázku je vybrán jeden pixel zdrojového obrázku, který je nejblíže jeho poloze, přičemž se bere v úvahu změna měřítka. Tato metoda vytváří pixelovaný obraz při zvětšení a velmi zrnitý obraz při zmenšení.

    Obecně lze kvalitu a výkon jakékoli redukční metody posuzovat podle poměru počtu pixelů podílejících se na vytvoření konečného obrázku k počtu pixelů v původním obrázku. Čím větší je tento poměr, tím je pravděpodobnější, že je algoritmus lepší a pomalejší. Poměr jedna znamená, že alespoň každý pixel ve zdrojovém obrázku přispěl ke konečnému obrázku. Ale u pokročilých metod to může být více než jedna. Pokud tedy například zmenšíme obrázek metodou nejbližšího souseda 3krát na každou stranu, pak je tento poměr 1/9. Tito. většina původních pixelů není nijak zohledněna.




    1920x1280 → 330x220 = 0,12 ms
    1920x1280 → 1067x667 = 1,86 ms

    Teoretická rychlost práce závisí pouze na velikosti výsledného obrázku. V praxi se při snižování podílejí vynechání mezipaměti procesoru: čím menší je měřítko, tím méně dat se použije z každého řádku načteného do mezipaměti.

    Metoda se vědomě používá ke snížení extrémně zřídka, protože. dává velmi špatná kvalita, i když to může být užitečné při zvětšení. Vzhledem k rychlosti a jednoduchosti implementace je ve všech knihovnách a aplikacích, které pracují s grafikou.

    Afinní transformace

    Afinní transformace jsou běžnou metodou pro zkreslení obrázků. Umožňují otočit, roztáhnout a odrazit obraz v jedné operaci. Proto v mnoha aplikacích a knihovnách, které implementují metodu afinní transformace, je funkce změny obrazu pouze obalem, který vypočítává koeficienty pro transformaci.

    Princip fungování spočívá v tom, že pro každý bod výsledného snímku se sejme pevná množina bodů zdrojového snímku a interpoluje se v souladu s jejich vzájemnou polohou a zvoleným filtrem. Počet bodů závisí také na filtru. Pro bilineární interpolaci se berou 2x2 zdrojové pixely, pro bikubickou 4x4. Tato metoda vytváří hladký obraz při přiblížení, ale při oddálení je výsledek velmi podobný nejbližšímu sousedovi. Přesvědčte se sami: teoreticky je s bikubickým filtrem a 3násobným zmenšením poměr zpracovaných pixelů k původním 4² / 3² = 1,78. V praxi je výsledek mnohem horší. ve stávajících implementacích se okno filtru a interpolační funkce neškálují podle měřítka obrazu a pixely blíže k okraji okna se berou se zápornými koeficienty (podle funkce), tzn. nepřispívají užitečně ke konečnému obrazu. Ve výsledku se snímek zmenšený bikubickým filtrem liší od snímku zmenšeného bilineárním filtrem pouze tím, že je ještě ostřejší. No a pro bilineární filtr a trojnásobné zmenšení je poměr zpracovaných pixelů k původním 2² / 3² = 0,44, což se nijak zásadně neliší od nejbližšího souseda. Ve skutečnosti nelze afinní transformace použít ke snížení více než faktoru 2. A i když jsou zmenšeny na dvakrát, dávají liniím znatelný žebříkový efekt.

    Teoreticky by měly existovat implementace přesně afinních transformací, které škálují okno filtru a samotný filtr v souladu s danými deformacemi, ale v populárních open source knihovnách zdrojový kód S takovým jsem se nesetkal.




    1920x1280 → 330x220 = 6,13 ms
    1920x1280 → 1067x667 = 17,7 ms
    1920x1280 → 4800x3200 = 869 ms

    Doba běhu je znatelně delší než u nejbližšího souseda a závisí na velikosti výsledného obrázku a velikosti okna zvoleného filtru. Téměř nezávisí na vynechání mezipaměti, protože zdrojové pixely se používají alespoň dva po jednom.

    Můj skromný názor je, že používat tuto metodu k libovolnému zmenšování obrázků je prostě je chyba, protože výsledek je velmi špatný a vypadá jako nejbližší soused a tato metoda vyžaduje mnohem více prostředků. Tato metoda však našla široké uplatnění v programech a knihovnách. Nejpřekvapivější je, že tato metoda se používá ve všech prohlížečích pro metodu drawImage() na plátně (ilustrativní příklad), i když k jednoduchému zobrazení obrázků v prvku se používají úhlednější metody (kromě IE, které pro oba případy používá afinní transformace). Kromě toho se tato metoda používá v OpenCV, současná verze Python knihovna Pillow (doufám, že o tom napíšu samostatně), v Paint.NET.

    Navíc je to právě tato metoda, kterou grafické karty používají k vykreslování 3D scén. Rozdíl je však v tom, že grafické karty připravují sadu zmenšených verzí (mip-levels) pro každou texturu předem a pro konečné vykreslení je vybrána úroveň s takovým rozlišením, aby redukce textury nebyla více než dvojnásobná. Kromě toho se pro eliminaci prudkého skoku při změně úrovně mip (když se texturovaný objekt přibližuje nebo vzdaluje) používá lineární interpolace mezi sousedními úrovněmi mip (to je již trilineární filtrování). Chcete-li tedy nakreslit každý pixel 3D objektu, musíte interpolovat mezi 2³ pixely. To poskytuje výsledek přijatelný pro rychle se pohybující obraz v čase, který je lineární s ohledem na konečné rozlišení.

    Supersampling (supersampling)

    Pomocí této metody jsou vytvořeny stejné mip-levels, pomocí ní (pokud je to značně zjednodušeno) funguje celoobrazovkový anti-aliasing ve hrách. Jeho podstatou je rozdělení původního obrázku na mřížku pixelů výsledného a sečtení všech původních pixelů, které dopadnou na každý pixel výsledného podle plochy, která pod výsledný pixel spadala. Při použití této metody pro přiblížení je ve zdrojovém obrázku přesně jeden pixel na každý pixel ve finálním obrázku. Proto se výsledek pro zvýšení rovná nejbližšímu sousedovi.

    Lze rozlišit dva poddruhy této metody: se zaokrouhlením hranic pixelů na nejbližší celé číslo a bez. V prvním případě se algoritmus stává nevhodným pro škálování méně než 3krát, protože jeden koncový pixel může mít jeden počáteční pixel a čtyři (2x2) mohou připadnout na sousední, což vede k disproporci na místní úrovni. Algoritmus zaokrouhlování lze přitom samozřejmě použít v případech, kdy je velikost zdrojového obrázku násobkem velikosti výsledného, ​​nebo je měřítko zmenšení dostatečně malé (verze s rozlišením 330×220 jsou téměř stejné). Poměr zpracovaných pixelů k původním při zaoblení okrajů je vždy roven jedné.




    1920x1280 → 330x220 = 7 ms
    1920x1280 → 1067x667 = 15ms
    1920x1280 → 4800x3200 = 22,5 ms

    Poddruh bez zaokrouhlení dává výborná kvalita při oddálení v libovolném měřítku, ale při přiblížení vytváří zvláštní efekt, kdy většina původního pixelu ve výsledném obrázku vypadá jednotně, ale na okrajích je přechod. Poměr zpracovaných pixelů k originálu bez zaokrouhlení hranic může být od jedné do čtyř, protože každý zdrojový pixel přispívá buď k jednomu konečnému, nebo ke dvěma sousedním, nebo ke čtyřem sousedním pixelům.




    1920x1280 → 330x220 = 19 ms
    1920x1280 → 1067x667 = 45 ms
    1920x1280 → 4800x3200 = 112 ms

    Výkon této redukční metody je nižší než u afinních transformací, protože všechny pixely původního obrázku jsou zapojeny do výpočtu výsledného obrázku. Verze zaokrouhlená na nejbližší hranice je obvykle několikanásobně rychlejší. Je také možné vytvořit samostatné verze pro pevný počet opakování (např. 2x zmenšení), které budou ještě rychlejší.

    Tato metoda se používá ve funkci gdImageCopyResampled() knihovny GD zahrnuté v PHP, dostupné v OpenCV (příznak INTER_AREA), Intel IPP, AMD Framewave. Na stejném principu funguje libjpeg, když několikrát otevře obrázky ve zmenšené podobě. Ten umožňuje otevření mnoha aplikací obrázky JPEG předem několikrát zmenšit bez velké režie (v praxi libjpeg otevírá miniatury ještě o něco rychleji než v plné velikosti) a poté použít jiné metody pro změnu velikosti, dokud přesné rozměry. Pokud například chcete změnit velikost JPEG 1920 x 1280 na 330 x 220, můžete otevřít původní obrázek v rozlišení 480 x 320 a poté jej zmenšit na požadovaných 330 x 220.

    Konvoluce

    Tato metoda je podobná afinním transformacím v tom, že používá filtry, ale nemá pevné okno, ale okno úměrné měřítku. Pokud je například velikost okna filtru 6 a velikost obrázku je zmenšena faktorem 2,5, pak (2,5 * 6)² = 225 pixelů se podílí na vytvoření každého pixelu konečného obrázku, což je mnohem více než v případě supervzorkování (od 9 do 16). Naštěstí lze konvoluce vypočítat ve 2 průchodech, nejprve v jednom směru, pak v druhém, takže algoritmická složitost výpočtu každého pixelu není 225, ale pouze (2,5 * 6) * 2 = 30. Podíl každého zdrojového pixelu na výsledném pixelu je právě určen filtrem. Poměr zpracovaných pixelů k původním je zcela určen velikostí okna filtru a je roven jeho čtverci. Tito. pro bilineární filtr bude tento poměr 4, pro bikubický filtr 16, pro Lanczos 36. Algoritmus funguje dobře jak pro snižování, tak pro zvyšování.




    1920x1280 → 330x220 = 76 ms
    1920x1280 → 1067x667 = 160 ms
    1920x1280 → 4800x3200 = 1540 ms

    Rychlost této metody závisí na všech parametrech: velikosti zdrojového obrázku, velikosti výsledného obrázku, velikosti okna filtru.

    Toto je metoda implementovaná v ImageMagick, GIMP, v aktuální verzi Pillow s příznakem ANTIALIAS.

    Jednou z výhod této metody je, že filtry lze nastavovat samostatnou funkcí, která není nijak vázána na implementaci metody. V tomto případě může být funkce samotného filtru poměrně složitá bez větších ztrát výkonu, protože koeficienty pro všechny pixely v jednom sloupci a pro všechny pixely v jednom řádku jsou brány v úvahu pouze jednou. Tito. samotná funkce filtru se nazývá pouze (m + n) * w krát, kde ma n jsou rozměry konečného obrázku a w je velikost okna filtru. A spousta těchto funkcí se dá snýtovat, mělo by to matematické opodstatnění. Například v ImageMagick je jich 15. Zde jsou ty nejoblíbenější:

    Bilineární filtr (bilineární nebo trojúhelníkový v ImageMagick)


    Bikubický filtr (bikubický , catrom v ImageMagick)


    Lanczosův filtr (Lanczos)

    Je pozoruhodné, že některé filtry mají zóny záporných koeficientů (např. bikubický filtr nebo Lanczosův filtr). To je nezbytné, aby přechody na konečném obrázku měly ostrost, která byla na originálu.

    Nyní lze vzorec (1) použít k interpolaci množin. Bude mít podobu:

    Chcete-li provést konstrukci přechodu nastavit na určitou hodnotu t, musíte nejprve sestavit množiny a poté najít jejich součet.

    Příklad 4 Nechť je kružnice o poloměru se středem v bodě = (0;0), je kružnice o poloměru se středem v nějakém bodě . Potom je interpolační množinou () kružnice se středem v bodě umístěném na segmentu / / poloměru (obr. 9).

    Obr.9. Interpolace dvou kružnic

    Opravdu, stanovení nějaké hodnoty t(), sestavte množiny a . Ocitneme se v podmínkách příkladu 2. Přepsáním jeho výsledku do aktuálního zápisu získáme požadované tvrzení. Vidíme, že v tomto případě přechodové obrazy (kruhy) sousedí se společnými tečnami nakreslenými ke dvěma původním kružnicím, tzn. výsledky interpolace velmi dobře souhlasí s našimi vizuálními reprezentacemi přechodových obrázků.

    Komentář. Z vlastností aritmetické operace nad množinami vyplývá, že podobný obrázek získáme interpolací libovolných dvou kružnic. Kružnici o poloměru se středem v libovolném bodě lze skutečně znázornit jako součet kružnice o poloměru se středem v bodě (0;0) a množiny sestávající z jednoho bodu (ekvivalentního vektoru): = + . Pak interpolační vzorec dává:

    = = + .

    Zbývá poznamenat, že rodina vektorů , , je přechodný od vektoru k nulovému vektoru.

    Pro usnadnění provádění interpolace (provádění aritmetických operací) lze tedy vždy vzít množiny (čísla) sousedící s počátkem, protože libovolné dané množiny jsou do takové situace redukovány posunem o určité vektory. Tyto vektory je pak třeba také interpolovat (se stejnou hodnotou parametru t).

    Mezi důležité vlastnosti metody si všimneme fakt, že při interpolaci dvou polygonů se interpolací získají vrcholy interpolačního polygonu (se stejnou hodnotou t) vrcholy původních polygonů. Vyplývá to z toho, že aritmetické operace na množinách jsou definovány z hlediska aritmetických operací na jejich jednotlivých vektorech. "Extrémní" vektor v přechodové sadě můžete získat pouze přidáním odpovídajících "extrémních" vektorů do původních sad.

    Příklad 5 Nechť je čtverec 2 x 2 s pravým dolním vrcholem v počátku, obdélník 4 x 5 s levým dolním vrcholem v počátku (strany obou obrazců jsou rovnoběžné se souřadnicovými osami) (obr. 10). Pojďme sestavit interpolační množinu .

    1 způsob. Použijeme vzorec (2) pro . Po sestavení souprav
    a (jejich hranice na obrázku 10 jsou nakresleny tečkovanými čarami), najdeme jejich součet. Vznikne nám obdélník.

    Obr.10. Interpolace obdélníků na základě aritmetických operací

    2 způsobem. Porovnejme odpovídající vrcholy původních obdélníků (in tento případ jejich korespondence je zřejmá, na Obr. 11 je znázorněna segmenty); interpolací každé z těchto dvojic bodů (vektorů) s daným , získáme vrcholy interpolační množiny (obdélníku).

    Obr.11. Interpolace obdélníku vrcholovou interpolací

    Opět platí, že diskutovaná interpolační metoda dává výsledek, který bychom očekávali.

    Příklad 6 Dovolit být pravoúhlé rovnoramenné trojúhelníky s přeponou h=100 a společný vrchol na počátku. Potom jako výsledek interpolace podle Minkowského dostaneme šestiúhelník (interpolační množina ) (obr. 12).

    Obr.12. Interpolace symetrických trojúhelníků

    Výpočty pomocí interpolačního vzorce (2) okamžitě vedou k uvedenému výsledku. Oproti předchozímu příkladu se v případě těchto trojúhelníků ukazuje srovnání vrcholů provedené Minkowského metodou i samotný výsledek poněkud nečekaně. Párová interpolace „horních“ a „spodních“ vrcholů trojúhelníků poskytuje „horní“ a „dolní“ vrcholy šestiúhelníku. Ale vrcholy pravých úhlů trojúhelníků jsou "interpolovány" z každého z "horních" a "dolních" vrcholů druhého trojúhelníku.

    Výsledek příkladu 6 samozřejmě zanechává otázky. Pokud se však nad tím zamyslíte, je nepravděpodobné, že bychom mohli nabídnout „logickou“ verzi přechodové sady. Zpočátku to mělo interpolovat "zavřít", podobné obrázky. Viz také poznámka níže o zvláštnostech interpolace opačných vektorů.

    Další případ je ještě překvapivější.

    Příklad 7 Nechť jsou segmenty na souřadnicových osách: ,

    . Pak je čtverec s první stranou, jehož spodní vrcholy jsou umístěny v bodech (1;0) a (2;0) (obr. 13).

    Obr.13. Interpolace segmentů

    Sady a jsou segmenty a . Jejich sečtením / přidáním ke každému bodu (vektoru) úsečky úsečku (všechny možné vektory z ní) / dostaneme čtverec. Za podmínek příkladu 7 by podle vizuálních reprezentací měl být přechodovou množinou samozřejmě segment, ale zvláštnosti interpolační metody vedou k obdélníku.

    Při analýze analyzovaných příkladů můžete vidět, že Minkowského algoritmus poskytuje vynikající výsledky v případech, kdy:

    1) ,

    2) získané z paralelního přenosu,

    3) Když jsou kroky 1 a 2 provedeny současně.

    V jiných případech může být výkon algoritmu neuspokojivý. Zejména, když sady a jsou získány otáčením od sebe navzájem. Kořeny tohoto stavu tkví v samotném přístupu: již pro vektory se značným úhlem mezi nimi je výsledek interpolace špatný (obr. 14).

    Obr.14. Interpolace vektorů svírajících velký úhel

    Důležitý bod v prezentované metodě je, že na jejím "základu" je možné stavět nové, pokročilejší algoritmy. Mají významný aplikovaný charakter a jsou aktivně využívány v moderní technologii.

    .

    S tím souvisí dodatečná omezení o použití aritmetických operací na množinách v algoritmech.

    Pokud se však použijí pouze kladná čísla, vše funguje. Taková struktura se v matematice nazývá „kužel“. Tito. obrázky s Minkowského operacemi na nich tvoří „kužel“.

    Chcete-li zvětšit nebo zmenšit velikost obrazu, Photoshop používá metodu interpolace. Když tedy například přiblížíte obrázek, Photoshop vytvoří další pixely na základě hodnot sousedních. Zhruba řečeno, pokud je jeden pixel černý a druhý bílý, Photoshop vypočítá průměrnou hodnotu a vytvoří nový pixel. šedá barva. Některé typy interpolace jsou rychlé a nekvalitní, jiné jsou složitější, ale dosahují dobrých výsledků.

    Nejprve přejdeme do hlavní nabídky Obrázek – Velikost obrázku (Obrázek – Velikost obrázku) nebo Alt+Ctrl+I.

    Pokud kliknete na šipku vedle parametru Převzorkování (převzorkování obrázku), pak se ve vyskakovacím okně objeví několik možností interpolace:

    • Automatický. aplikace Photoshop vybere metodu převzorkování na základě typu dokumentu a podle toho, zda se má zvětšit nebo zmenšit.
    • Zachovat detaily (zvětšení). Když vyberete tuto metodu, zpřístupní se posuvník Redukce šumu pro vyhlazení šumu při změně měřítka obrazu.
    • Zachovat podrobnosti 2.0. Tento algoritmus dává velmi zajímavý výsledek zvětšení obrazu. Detail se samozřejmě nestává podrobnější, ale ten, který je zvětšen poměrně hodně bez ztráty přehlednosti.
    • . dobrá metoda pro zvětšování obrázků na základě bikubické interpolace, navržené speciálně pro hladší výsledky.
    • Bicubic Sharper (redukce). Dobrá metoda pro zmenšení velikosti obrazu je založena na zaostřené bikubické interpolaci. Tato metoda umožňuje zachovat detaily převzorkovaného obrázku. Pokud interpolace "Bicubic Downscale" způsobí, že některé oblasti obrazu jsou příliš ostré, zkuste použít bikubickou interpolaci.
    • Bkubický (hladké přechody). Pomalejší, ale více přesná metoda na základě analýzy barevných hodnot okolních pixelů. Díky použití složitějších výpočtů vytváří bikubická interpolace hladší barevné přechody než interpolace sousedních pixelů nebo bilineární interpolace.
    • Podle sousedních pixelů (pevné okraje) (Nejbližší soused (pevné okraje)). Rychlá, ale méně přesná metoda, která replikuje pixely obrázku. Tato metoda zachovává ostré okraje a vytváří zmenšenou velikost souboru v ilustracích, které obsahují hrubé okraje. Tato metoda však může vytvořit zubaté okraje, které se stanou patrnými při deformaci nebo změně velikosti obrazu nebo při provádění mnoha operací výběru.
    • Bilineární (bilineární). Tato metoda přidává nové pixely výpočtem průměrné hodnoty barev okolních pixelů. Poskytuje výsledek průměrné kvality.

    Příklad použití Bicubic Smoother (zvětšení):

    K dispozici je fotografie, rozměry 600 x 450 pixelů, rozlišení 72 dpi

    Musíme to zvýšit. Otevře okno Velikost obrázku a vybrat si Bicubic Smoother (zvětšení), měrné jednotky - procenta.

    Rozměry dokumentu se okamžitě nastaví na 100 %. Dále budeme obrázek postupně zvětšovat. Změňte hodnotu ze 100 % na 110 %. Když změníte šířku, výška se automaticky upraví sama.

    Nyní jsou jeho rozměry již 660 x 495 pixelů. Opakováním těchto kroků můžete dosáhnout dobré výsledky. Samozřejmě bude pro nás docela obtížné dosáhnout dokonalé čistoty, protože fotografie byla malá a s nízkým rozlišením. Podívejte se ale na změny v pixelech.

    Jak velké můžeme udělat fotografie díky metodě interpolace? Vše záleží na kvalitě fotografie, na tom, jak byla pořízena a za jakým účelem ji zvětšujete. Nejlepší odpověď: vezměte si to a uvidíte sami.

    Uvidíme se v další lekci!

    Funkce změny velikosti obrázku poskytovaná Emgu (.net wrapper pro OpenCV) může používat kteroukoli ze čtyř interpolačních metod:

    • CV_INTER_NN (výchozí)
    • CV_INTER_LINEAR
    • CV_INTER_CUBIC
    • CV_INTER_AREA

    Lineární interpolaci zhruba rozumím, ale co je krychle nebo plocha, mohu jen hádat. Mám podezření, že NN znamená nejbližší soused, ale mohu se mýlit.

    Důvod, proč měním velikost obrázku, je snížit počet pixelů (v určitém okamžiku se budou opakovat) a zároveň je zachovat reprezentativní. Zmiňuji to, protože se mi zdá, že interpolace je pro tento účel ústřední – proto správný typ by měla být velmi důležitá.

    Moje otázka zní, jaké jsou výhody a nevýhody jednotlivých interpolačních metod? Jak se liší a který z nich bych měl použít?

    4 odpovědi

    Nejbližší soused bude co nejrychlejší, ale při změně velikosti přijdete o podstatné informace.

    Lineární interpolace je méně rychlá, ale neztratí informace, pokud obrázek nezmenšíte (což jste).

    Kubická interpolace (pravděpodobně ve skutečnosti „Bkubická“) používá jeden z mnoha možných vzorců, které zahrnují více sousedních pixelů. To je mnohem lepší pro zmenšení obrázků, ale stále jste omezeni v tom, jak moc můžete zmenšit bez ztráty informací. V závislosti na algoritmu můžete obrázky zmenšit o 50 % nebo 75 %. Hlavní výhodou tohoto přístupu je, že je mnohem pomalejší.

    Nejste si jisti, co je "area" - ve skutečnosti by to mohlo být "Bicubic". S největší pravděpodobností tato možnost poskytne nejlepší výsledek (z hlediska ztráty/vzhledu informací), ale na úkor nejdelší doby zpracování.

    Použitá metoda interpolace závisí na tom, čeho se snažíte dosáhnout:

    CV_INTER_LINEAR nebo CV_INTER_CUBIC používá nízkopropustný filtr (střední), aby dosáhl kompromisu mezi vizuální kvalitou a odstraněním okrajů (dolní propusti mají tendenci odstraňovat okraje, aby omezily aliasing obrazu). Mezi těmito dvěma bych vám doporučil CV_INTER_CUBIC.

    Metoda CV_INTER_NN je ve skutečnosti nejbližší soused, toto je nejzákladnější metoda a získáte ostřejší hrany (nebude aplikován žádný dolní propust). Tato metoda je však jen jako „zmenšování“ obrazu, žádné vizuální vylepšení.

    Algoritmy: (popisy z dokumentace OpenCV)

    • INTER_NEAREST - interpolace nejbližšího souseda
    • INTER_LINEAR – bilineární interpolace (ve výchozím nastavení)
    • INTER_AREA - převzorkování pomocí poměru plochy pixelů. Toto může být preferovaná metoda pro decimaci obrazu, protože poskytuje výsledky bez moaré. Ale když je obrázek zmenšen, je to jako metoda INTER_NEAREST.
    • INTER_CUBIC - bikubická interpolace v okolí 4x4 pixelů.
    • INTER_LANCZOS4 - Lanczosova interpolace v sousedství 8x8 pixelů

    Pokud chcete zvýšit rychlost, použijte metodu Nejbližší soused.