SciPy: konvoluce, fitrace a další operace prováděné s dvourozměrnými signály

23. 4. 2026
Doba čtení: 36 minut

Sdílet

Vědec používá ke své práci počítač a Python
Autor: Root.cz s využitím Zoner AI
Dokončíme popis operací, které je možné provádět s dvourozměrnými signály, tj. především s rastrovými obrázky. Ukážeme si zejména klasickou konvoluci s konvolučním jádrem zadaným maticí a funkce balíčku ndimage.

Konvoluce dvourozměrných signálů

Co se dozvíte v článku
  1. Konvoluce dvourozměrných signálů
  2. Jádro konvoluce vyjádřené maticí
  3. Funkce signal.convolve
  4. Rozmazání obrázku s využitím konvolučního jádra 3×3 hodnoty
  5. Gaussovský filtr s konvolučním jádrem 3×3 prvky
  6. Detekce hran ve vertikálním směru
  7. Detekce hran v horizontálním směru
  8. Sofistikovanější konvoluční jádra
  9. Gaussovský filtr: vliv hodnoty sigma na provedenou operaci
  10. Laplaceův filtr
  11. Aplikace Laplaceova filtru na rastrový obrázek
  12. Kombinace původního obrázku s výsledkem aplikace Laplaceova filtru
  13. Sobelův operátor
  14. Sobelův operátor nabízený knihovnou SciPy
  15. Aplikace Sobelova filtru na rastrový obrázek
  16. Kombinace původního obrázku a výsledku aplikace Sobelova operátoru
  17. Otestování filtrů na zašuměném obrázku
  18. Výsledky aplikace Gaussovského filtru
  19. Repositář s demonstračními příklady
  20. Odkazy na Internetu

V pořadí již šestém článku o knihovně SciPy dokončíme popis operací, které je možné provádět s dvourozměrnými signály, tj. především s rastrovými obrázky. Připomeňme si, že minule jsme se zabývali transformacemi rastrových obrázků. Mezi tyto operace patří DFT (realizovaná jako FFT) a dále DCT i DST, tedy diskrétní kosinová a sinová transformace. Dnes si ukážeme zejména klasickou konvoluci s konvolučním jádrem zadaným maticí, ovšem nezapomeneme ani na funkce poskytované balíčkem ndimage, ve kterém se (kromě dalších funkcí) nachází i realizace užitečných filtrů.

Jádro konvoluce vyjádřené maticí

Jádro konvoluce je možné v případě, že se konvoluce aplikuje na rastrové obrázky, vyjádřit maticí. Při použití knihovny SciPy je matice většinou reprezentována n-rozměrným polem (nd-array) podporovaným knihovnou NumPy. Konvolučních filtrů tohoto typu existuje celá řada, od velmi primitivních, až po relativně sofistikované filtry. Jen pro zajímavost se na některá konvoluční jádra podívejme.

Rozmazání obrázku tak, že se každý pixel zprůměruje se sousedními pixely (čtyřokolí). Výsledek se dělí pěti:

 [ 0, 1, 0 ]
 [ 1, 1, 1 ]
 [ 0, 1, 0 ]

Rozmazání obrázku tak, že se každý pixel zprůměruje se sousedními pixely (osmiokolí). Výsledek se dělí devíti:

 [ 1, 1, 1 ]
 [ 1, 1, 1 ]
 [ 1, 1, 1 ]

Gaussův filtr, výsledek se dělí šestnácti:

 [ 1, 2, 1 ]
 [ 2, 4, 2 ]
 [ 1, 2, 1 ]

Jedna z možností realizace filtru pro zvýraznění změn v obraze:

 [ 0, -1,  0 ]
 [-1,  5, -1 ]
 [ 0, -1,  0 ]

Detekce hran:

 [ 0, -1,  0 ]
 [-1,  4, -1 ]
 [ 0, -1,  0 ]

Jedna z forem Laplaceova filtru:

 [ 0,  1,  0 ]
 [ 1, -4,  1 ]
 [ 0,  1,  0 ]

Sobelovy operátory:

 [-1,  0,  1]
 [-2,  0,  2]
 [-1,  0,  1]
 
 [-1, -2, -1]
 [ 0,  0,  0]
 [ 1,  2,  1]

Funkce signal.convolve

Velmi často volanou operací, která se při zpracování signálů používá, je konvoluce (convolution). Ta může být provedena jak pro jednorozměrné signály (zvukové filtry atd.), tak i pro vícerozměrné signály (známé jsou konvoluční filtry v oblasti zpracování obrazu, které nás primárně zajímají právě v dnešním článku). Konvoluci dvou signálů, typicky zpracovávaného signálu a konvolučního jádra, lze vypočítat s využitím funkce nazvané přímočaře convolve (nalezneme ji v podbalíčku signal):

Help on function convolve in module scipy.signal._signaltools:
 
convolve(in1, in2, mode='full', method='auto')
    Convolve two N-dimensional arrays.
 
    Convolve `in1` and `in2`, with the output size determined by the
    `mode` argument.
 
    Parameters
    ----------
    in1 : array_like
        First input.
    in2 : array_like
        Second input. Should have the same number of dimensions as `in1`.
    mode : str {'full', 'valid', 'same'}, optional
        A string indicating the size of the output:
 
        ``full``
           The output is the full discrete linear convolution
           of the inputs. (Default)
        ``valid``
           The output consists only of those elements that do not
           rely on the zero-padding. In 'valid' mode, either `in1` or `in2`
           must be at least as large as the other in every dimension.
        ``same``
           The output is the same size as `in1`, centered
           with respect to the 'full' output.
    method : str {'auto', 'direct', 'fft'}, optional
        A string indicating which method to use to calculate the convolution.
 
        ``direct``
           The convolution is determined directly from sums, the definition of
           convolution.
        ``fft``
           The Fourier Transform is used to perform the convolution by calling
           `fftconvolve`.
        ``auto``
           Automatically chooses direct or Fourier method based on an estimate
           of which is faster (default).  See Notes for more detail.

           .. versionadded:: 0.19.0
 
    Returns
    -------
    convolve : array
        An N-dimensional array containing a subset of the discrete linear
        convolution of `in1` with `in2`.

Rozmazání obrázku s využitím konvolučního jádra 3×3 hodnoty

Při úpravách fotografií nebo naskenovaných obrázků se poměrně často můžeme setkat s požadavkem na odstranění šumu z obrazu nebo z jeho vybrané části. K tomuto účelu můžeme použít poměrně velké množství více či méně sofistikovaných filtrů, které lze pro odstranění šumu použít. Nejjednodušším a taktéž nejrychlejším filtrem, který dokáže odstranit vysoké frekvence v obrazu a tím i šum (bohužel spolu s ostrými hranami) je filtr, který pracuje velmi jednoduše – spočítá průměrnou hodnotu devíti sousedních pixelů tvořících blok o velikosti 3×3 pixely a tuto hodnotu uloží do pixelu ležícího přesně uprostřed bloku (operace je samozřejmě provedena pro všechny pixely v obrazu). Výsledkem je sice obraz s odstraněným vysokofrekvenčním šumem, ale současně s potlačením šumu došlo k rozmazání všech jednopixelových hran na přechody široké minimálně tři pixely. Z implementačního hlediska se jedná o konvoluční filtr, jehož konvoluční jádro je velmi jednoduché:

1/9   1/9   1/9
1/9   1/9   1/9
1/9   1/9   1/9

Nás ovšem nebudou zajímat absolutní hodnoty výsledky, takže klidně můžeme použít jádro:

1   1   1
1   1   1
1   1   1

Programová aplikace takového konvolučního jádra může vypadat následovně:

import numpy as np
 
import matplotlib.pyplot as plt
 
from scipy.signal import convolve
import scipy.datasets as datasets
 
 
# načtení matice
ascent = datasets.ascent()
 
# matice 3x3 prvky obsahující jedničky (NEjedná se o jednotkovou matici)
kernel = np.ones([3, 3])
 
print("Kernel:")
print(kernel)
 
# výpočet konvoluce
filtered = convolve(ascent, kernel)
 
# zobrazení výsledku
plt.imshow(filtered, cmap="gray")
 
plt.title("2D convolution")
 
# uložení grafu s průběhem signálu
plt.savefig("convolve_2d_1.png")
 
# zobrazení grafu
plt.show()

A takto by měl vypadat výsledek:

Rozostření obrázku s využitím jednoduchého konvolučního filtru.

Obrázek 1: Rozostření obrázku s využitím jednoduchého konvolučního filtru.

Autor: tisnik, podle licence: Rights Managed

Gaussovský filtr s konvolučním jádrem 3×3 prvky

Dalším typem filtru určeného k odstranění šumu z rastrových obrázků je Gaussovský filtr (Gaussian Blur), v němž se též provádí průměrování hodnot sousedních pixelů, ale, na rozdíl od filtru předchozího, jsou těmto pixelům přiřazeny různé váhy v závislosti na jejich vzdálenosti od středního pixelu. Váhy jsou zvoleny tak, aby (velmi nepřesně) aproximovaly Gaussovo rozložení v 2D:

1   2   1
2   4   2
1   2   1

Taktéž v tomto případě se jedná o konvoluční filtr, ovšem velikost konvolučního jádra je možné měnit. Běžně se používají velikosti jádra 3×3 či 5×5 pixelů, protože při větší velikosti jádra již mají vzdálenější pixely tak nízkou váhu, že se výpočet pouze zbytečně prodlužuje bez většího vlivu na výsledný obrázek.

Opět se podívejme na jednoduchou implementaci tohoto filtru (později si ukážeme sofistikovanější řešení):

import numpy as np
 
import matplotlib.pyplot as plt
 
from scipy.signal import convolve
import scipy.datasets as datasets
 
 
# načtení matice
ascent = datasets.ascent()
 
kernel = np.array([
    [ 1, 2, 1 ],
    [ 2, 4, 2 ],
    [ 1, 2, 1 ],
])
 
print("Kernel:")
print(kernel)
 
# výpočet konvoluce
filtered = convolve(ascent, kernel)
 
# zobrazení výsledku
plt.imshow(filtered, cmap="gray")
 
plt.title("2D convolution")
 
# uložení grafu s průběhem signálu
plt.savefig("convolve_2d_2.png")
 
# zobrazení grafu
plt.show()

Nyní bude výsledek vypadat takto:

Rozostření obrázku s využitím jednoduchého konvolučního filtru.

Obrázek 2:  Rozostření obrázku s využitím jednoduchého Gaussovského konvolučního filtru.

Autor: tisnik, podle licence: Rights Managed

Poznámka: na této fotografii to sice není příliš patrné, ale hrany nejsou rozostřeny do takové míry, jako u obrázku prvního.

Detekce hran ve vertikálním směru

Mezi další typy jednoduchých konvolučních filtrů patří filtry určené pro detekci hran v horizontálním či vertikálním směru (hledání hran v jiných směrech již vyžaduje sofistikovanější operace). Teoreticky lze konvoluční jádra těchto filtrů reprezentovat sloupcovým či řádkovým vektorem, nikoli maticí, ovšem pro porovnání s dalšími příklady budu stále používat matice 3×3 prvky. Detekce hran ve vertikálním směru tím nejjednodušším možným filtrem může vypadat například takto:

import numpy as np
 
import matplotlib.pyplot as plt
 
from scipy.signal import convolve
import scipy.datasets as datasets
 
 
# načtení matice
ascent = datasets.ascent()
 
kernel = np.array([
    [-1, -1, -1],
    [ 0,  0,  0],
    [ 1,  1,  1],
])
 
print("Kernel:")
print(kernel)
 
# výpočet konvoluce
filtered = convolve(ascent, kernel)
 
# zobrazení výsledku
plt.imshow(filtered, cmap="gray")
 
plt.title("2D convolution")
 
# uložení grafu s průběhem signálu
plt.savefig("convolve_2d_3.png")
 
# zobrazení grafu
plt.show()

Výsledek provedené konvoluce:

Hledání hran v obrázku s využitím konvolučního filtru.

Obrázek 3:  Hledání hran v obrázku s využitím konvolučního filtru.

Autor: tisnik, podle licence: Rights Managed

Poznámka: zvýrazněny jsou především horizontální hrany (zábradlí atd.).

Detekce hran v horizontálním směru

Pouhou transpozicí matice použité v předchozím příkladu lze realizovat hledání hran ve směru horizontálním. Podívejme se na upravený příklad, který tuto operaci provádí:

import numpy as np
 
import matplotlib.pyplot as plt
 
from scipy.signal import convolve
import scipy.datasets as datasets
 
 
# načtení matice
ascent = datasets.ascent()
 
kernel = np.array([
    [-1,  0,  1],
    [-1,  0,  1],
    [-1,  0,  1],
])
 
print("Kernel:")
print(kernel)
 
# výpočet konvoluce
filtered = convolve(ascent, kernel)
 
# zobrazení výsledku
plt.imshow(filtered, cmap="gray")
 
plt.title("2D convolution")
 
# uložení grafu s průběhem signálu
plt.savefig("convolve_2d_4.png")
 
# zobrazení grafu
plt.show()

Nyní bude výsledek vypadat následovně:

Hledání hran v obrázku s využitím konvolučního filtru.

Obrázek 4:  Hledání hran v obrázku s využitím konvolučního filtru.

Autor: tisnik, podle licence: Rights Managed

Poznámka: nyní jsou naopak zvýrazněny hrany vertikální (sloupy).

Sofistikovanější konvoluční jádra

Knihovna SciPy nabízí v podbalíčku nazvaném ndimage filtry pro odstranění šumu i pro zvýraznění hran. Jedním z těchto filtrů je i výše zmíněný Gaussovský filtr, který je vypočten a aplikován funkcí gaussian_filter:

gaussian_filter(input, sigma, order=0, output=None, mode='reflect', cval=0.0, truncate=4.0, *, radius=None, axes=None)
    Multidimensional Gaussian filter.
 
    Parameters
    ----------
    input : array_like
        The input array.
    sigma : scalar or sequence of scalars
        Standard deviation for Gaussian kernel. The standard
        deviations of the Gaussian filter are given for each axis as a
        sequence, or as a single number, in which case it is equal for
        all axes.
    order : int or sequence of ints, optional
        The order of the filter along each axis is given as a sequence
        of integers, or as a single number. An order of 0 corresponds
        to convolution with a Gaussian kernel. A positive order
        corresponds to convolution with that derivative of a Gaussian.
    output : array or dtype, optional
        The array in which to place the output, or the dtype of the
        returned array. By default an array of the same dtype as input
        will be created.
    mode : str or sequence, optional
        The `mode` parameter determines how the input array is extended
        when the filter overlaps a border. By passing a sequence of modes
        with length equal to the number of dimensions of the input array,
        different modes can be specified along each axis. Default value is
        'reflect'. The valid values and their behavior is as follows:

Otestujme si aplikaci tohoto filtru na obrázek (matici) 6×6 pixelů:

import numpy as np
 
from scipy import ndimage
 
 
input_matrix = np.array([
    [5, 5, 5, 5, 5, 5],
    [5, 0, 5, 5, 5, 5],
    [5, 5, 5, 5, 5, 5],
    [5, 5, 5, 5, 5, 5],
    [5, 5, 5, 5,10, 5],
    [5, 5, 5, 5, 5, 5],
    ])
 
# aplikace filtru
filtered = ndimage.gaussian_filter(input_matrix, sigma=0.5)
 
print(filtered)
 
print()
 
# aplikace filtru
filtered2 = ndimage.gaussian_filter(input_matrix, sigma=0.7)
 
print(filtered2)

Výsledkem je do různé míry „rozmazaný“ pixel s příliš velkou nebo naopak s příliš malou hodnotou:

[[4 4 4 4 5 5]
 [4 1 4 4 5 5]
 [4 4 4 4 5 5]
 [4 4 4 4 5 5]
 [5 5 5 5 7 5]
 [5 5 5 5 5 5]]
 
[[4 3 4 4 4 5]
 [4 3 4 4 4 5]
 [4 3 4 4 4 5]
 [4 4 4 5 5 5]
 [4 4 4 5 6 5]
 [5 5 5 5 5 5]]

Gaussovský filtr: vliv hodnoty sigma na provedenou operaci

V Gaussově funkci, ze které je Guassovský filtr odvozen, určuje parametr sigma šířku či strmost „zvonovité“ části křivky. Čím menší je tento parametr, tím užší zvonovitá část bude. Při aplikaci filtru to znamená, že výsledný obraz bude více zaostřený. To si ostatně můžeme otestovat v praxi.

Nejprve nastavíme parametr sigma na hodnotu 2.0:

import numpy as np
 
import scipy.datasets as datasets
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
 
# načtení matice
ascent = datasets.ascent()
 
# aplikace filtru
blurred = ndimage.gaussian_filter(ascent, sigma=2.0)
 
# zobrazení výsledku, změna měřítka
plt.imshow(blurred, cmap="gray")
 
plt.title("Gaussian filter")
 
# uložení matice do rastrového obrázku
plt.savefig("gaussian_filter_1.png")
 
# zobrazení grafu
plt.show()

Výsledek:

Gaussův filtr.

Obrázek 5:  Gaussův filtr.

Autor: tisnik, podle licence: Rights Managed

Většího rozostření dosáhneme zvětšením hodnoty sigma:

import numpy as np
 
import scipy.datasets as datasets
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
 
# načtení matice
ascent = datasets.ascent()
 
# aplikace filtru
blurred = ndimage.gaussian_filter(ascent, sigma=5.0)
 
# zobrazení výsledku, změna měřítka
plt.imshow(blurred, cmap="gray")
 
plt.title("Gaussian filter")
 
# uložení matice do rastrového obrázku
plt.savefig("gaussian_filter_2.png")
 
# zobrazení grafu
plt.show()

Výsledek:

Gaussův filtr.

Obrázek 6:  Gaussův filtr.

Autor: tisnik, podle licence: Rights Managed

Poznámka: tato hodnota ovšem může být i menší než 1.0, musí však být kladná.

Laplaceův filtr

Laplaceův filtr (Laplacián, i když striktně chápáno je to nesprávné jméno) slouží ke zvýraznění změn v obrázku (tedy například k „doostření“), popř. jako jeden z kroků při detekci hran, které se v obrázku nachází. Taktéž se při typické implementaci jedná o konvoluční filtr, což znamená, že se jádro filtru (kernel) postupně aplikuje na všechny pixely zdrojového obrázku i na jejich okolí.

Aplikace Laplaceova filtru na obrázek je jednoduchá: použijeme funkci ndimage.laplace:

laplace(input, output=None, mode='reflect', cval=0.0, *, axes=None)
    N-D Laplace filter based on approximate second derivatives.
 
    Parameters
    ----------
    input : array_like
        The input array.
    output : array or dtype, optional
        The array in which to place the output, or the dtype of the
        returned array. By default an array of the same dtype as input
        will be created.
    mode : str or sequence, optional
        The `mode` parameter determines how the input array is extended
        when the filter overlaps a border. By passing a sequence of modes
        with length equal to the number of dimensions of the input array,
        different modes can be specified along each axis. Default value is
        'reflect'. The valid values and their behavior is as follows:

Vyzkoušejme si, jak filtr reaguje na dvojici změn v obrázku 6×6 hodnot: konkrétně na nulový prvek a naopak na prvek s hodnotou 10, když průměr je 5:

import numpy as np
 
from scipy import ndimage
 
 
input_matrix = np.array([
    [5, 5, 5, 5, 5, 5],
    [5, 0, 5, 5, 5, 5],
    [5, 5, 5, 5, 5, 5],
    [5, 5, 5, 5, 5, 5],
    [5, 5, 5, 5,10, 5],
    [5, 5, 5, 5, 5, 5],
    ])
 
# aplikace filtru
filtered = ndimage.laplace(input_matrix)
 
print(filtered)

Obě změny jsou ve výsledku zvýrazněny i s opačnými hodnotami v okolí:

[[  0  -5   0   0   0   0]
 [ -5  20  -5   0   0   0]
 [  0  -5   0   0   0   0]
 [  0   0   0   0   5   0]
 [  0   0   0   5 -20   5]
 [  0   0   0   0   5   0]]

Aplikace Laplaceova filtru na rastrový obrázek

Přímá aplikace Laplaceova filtru na rastrový obrázek je realizovaná snadno: přímým voláním funkce ndimage.laplace s předáním obrázku do této funkce:

import numpy as np
 
import scipy.datasets as datasets
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
 
# načtení matice
ascent = datasets.ascent()
 
# aplikace filtru
filtered = ndimage.laplace(ascent)
 
# zobrazení výsledku, změna měřítka
plt.imshow(filtered, cmap="gray")
 
plt.title("Laplace filter")
 
# uložení matice do rastrového obrázku
plt.savefig("laplace_filter_1.png")
 
# zobrazení grafu
plt.show()

Z výsledku je patrné, jakým způsobem jsou zvýrazněny všechny změny (vypočtené jako numerická derivace) v obrázku:

Laplaceův filtr.

Obrázek 7:  Laplaceův filtr.

Autor: tisnik, podle licence: Rights Managed

Poznámka: pro uměle vzniklé obrázky bude změn méně; obrázek totiž nebude (nebo by aspoň neměl) obsahovat šum.

Kombinace původního obrázku s výsledkem aplikace Laplaceova filtru

Dále je možné výsledek aplikace Laplaceova filtru přičíst nebo odečíst od původního obrázku. Přičtení bude mít za následek odstranění změn (či šumu), odečtení naopak zvýraznění těchto změn. Ostatně si to můžeme velmi snadno otestovat:

import numpy as np
 
import scipy.datasets as datasets
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
 
# načtení matice
ascent = datasets.ascent()
 
# aplikace filtru
filtered = ndimage.laplace(ascent)
 
# zobrazení výsledku, změna měřítka
plt.imshow(ascent-filtered, cmap="gray")
 
plt.title("Laplace filter")
 
# uložení matice do rastrového obrázku
plt.savefig("laplace_filter_2.png")
 
# zobrazení grafu
plt.show()

Při pohledu na výsledný obrázek je patrné, že se všechny změny skutečně ještě více zvýraznily:

Kombinace původního obrázku a výsledku aplikace Laplaceova filtru.

Obrázek 8:  Kombinace původního obrázku a výsledku aplikace Laplaceova filtru.

Autor: tisnik, podle licence: Rights Managed

Poznámka: tento filtr je nezávislý na směru, nedokáže tedy detekovat celé hrany.

Sobelův operátor

Třetím typem filtru, se kterým se dnes seznámíme, je Sobelův operátor, který lze použít pro detekci hran v určitém směru. Tento filtr kombinuje odstranění šumu v jednom směru s detekcí hran v kolmém směru. I tento filtr, resp. jeho konvoluční jádro, je možné reprezentovat maticí:

import numpy as np
 
import matplotlib.pyplot as plt
 
from scipy.signal import convolve
import scipy.datasets as datasets
 
 
# načtení matice
ascent = datasets.ascent()
 
kernel = np.array([
    [-1,  0,  1],
    [-2,  0,  2],
    [-1,  0,  1],
])
 
print("Kernel:")
print(kernel)
 
# výpočet konvoluce
filtered = convolve(ascent, kernel)
 
# zobrazení výsledku
plt.imshow(filtered, cmap="gray")
 
plt.title("2D convolution")
 
# uložení grafu s průběhem signálu
plt.savefig("convolve_2d_5.png")
 
# zobrazení grafu
plt.show()

Výsledkem je tento obrázek – zvýrazněny jsou vertikální hrany:

Sobelův operátor realizovaný konvolučním filtrem.

Obrázek 9:  Sobelův operátor realizovaný konvolučním filtrem.

Autor: tisnik, podle licence: Rights Managed

Matici s konvolučním jádrem ovšem můžeme i transponovat:

import numpy as np
 
import matplotlib.pyplot as plt
 
from scipy.signal import convolve
import scipy.datasets as datasets
 
 
# načtení matice
ascent = datasets.ascent()
 
kernel = np.array([
    [-1, -2, -1],
    [ 0,  0,  0],
    [ 1,  2,  1],
])
 
print("Kernel:")
print(kernel)
 
# výpočet konvoluce
filtered = convolve(ascent, kernel)
 
# zobrazení výsledku
plt.imshow(filtered, cmap="gray")
 
plt.title("2D convolution")
 
# uložení grafu s průběhem signálu
plt.savefig("convolve_2d_6.png")
 
# zobrazení grafu
plt.show()

Výsledek bude odlišný – zvýrazněny budou spíše hrany vodorovné:

Sobelův operátor realizovaný konvolučním filtrem.

Obrázek 10:  Sobelův operátor realizovaný konvolučním filtrem.

Autor: tisnik, podle licence: Rights Managed

Sobelův operátor nabízený knihovnou SciPy

I Sobelův operátor je nabízený přímo knihovnou SciPy. Jeho implementaci nalezneme opět v podbalíčku nazvaném ndimage:

sobel(input, axis=-1, output=None, mode='reflect', cval=0.0)
    Calculate a Sobel filter.
 
    Parameters
    ----------
    input : array_like
        The input array.
    axis : int, optional
        The axis of `input` along which to calculate. Default is -1.
    output : array or dtype, optional
        The array in which to place the output, or the dtype of the
        returned array. By default an array of the same dtype as input
        will be created.
    mode : str or sequence, optional
        The `mode` parameter determines how the input array is extended
        when the filter overlaps a border. By passing a sequence of modes
        with length equal to the number of dimensions of the input array,
        different modes can be specified along each axis. Default value is
        'reflect'. The valid values and their behavior is as follows:

Jak jsme si již ukázali v předchozích kapitolách pro Gaussův a Laplaceův filtr, pokusíme se o aplikaci Sobelova operátoru na matici 6×6 prvků, ve které mají pouze dva prvky odlišnou hodnotu (jeden příliš malou, druhý naopak příliš velkou):

import numpy as np
 
from scipy import ndimage
 
 
input_matrix = np.array([
    [5, 5, 5, 5, 5, 5],
    [5, 0, 5, 5, 5, 5],
    [5, 5, 5, 5, 5, 5],
    [5, 5, 5, 5, 5, 5],
    [5, 5, 5, 5,10, 5],
    [5, 5, 5, 5, 5, 5],
    ])
 
# aplikace filtru
filtered = ndimage.sobel(input_matrix, axis=0)
 
print(filtered)
 
print()
 
# aplikace filtru
filtered2 = ndimage.sobel(input_matrix, axis=1)
 
print(filtered2)

V prvním případě se naleznou změny ve vertikálním směru:

[[ -5 -10  -5   0   0   0]
 [  0   0   0   0   0   0]
 [  5  10   5   0   0   0]
 [  0   0   0   5  10   5]
 [  0   0   0   0   0   0]
 [  0   0   0  -5 -10  -5]]

Ve druhém případě se změny naleznou ve směru horizontálním:

[[ -5   0   5   0   0   0]
 [-10   0  10   0   0   0]
 [ -5   0   5   0   0   0]
 [  0   0   0   5   0  -5]
 [  0   0   0  10   0 -10]
 [  0   0   0   5   0  -5]]

Aplikace Sobelova filtru na rastrový obrázek

Vyzkoušejme si nyní aplikaci funkce ndimage.sobel na testovací rastrový obrázek z původní datové sady knihovny SciPy:

import numpy as np
 
import scipy.datasets as datasets
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
 
# načtení matice
ascent = datasets.ascent()
 
# aplikace filtru
filtered = ndimage.sobel(ascent, axis=0)
 
# zobrazení výsledku, změna měřítka
plt.imshow(filtered, cmap="gray")
 
plt.title("Sobel operator")
 
# uložení matice do rastrového obrázku
plt.savefig("sobel_operator_1.png")
 
# zobrazení grafu
plt.show()

Výsledek přímé aplikace Sobelova operátoru dopadne následovně:

Přímý výsledek aplikace Sobelova operátoru.

Obrázek 11:  Přímý výsledek aplikace Sobelova operátoru.

Autor: tisnik, podle licence: Rights Managed

Dtto, ovšem nyní bude filtr otočen o 90° (viz parametr axis=1):

import numpy as np
 
import scipy.datasets as datasets
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
 
# načtení matice
ascent = datasets.ascent()
 
# aplikace filtru
filtered = ndimage.sobel(ascent, axis=1)
 
# zobrazení výsledku, změna měřítka
plt.imshow(filtered, cmap="gray")
 
plt.title("Sobel operator")
 
# uložení matice do rastrového obrázku
plt.savefig("sobel_operator_2.png")
 
# zobrazení grafu
plt.show()

Výsledek:

Přímý výsledek aplikace Sobelova operátoru.

Obrázek 12:  Přímý výsledek aplikace Sobelova operátoru.

Autor: tisnik, podle licence: Rights Managed

Kombinace původního obrázku a výsledku aplikace Sobelova operátoru

V předchozím textu jsme si ukázali, jak lze zkombinovat původní obrázek s výsledkem aplikace Laplaceova filtru. Totéž ovšem můžeme provést i s původním obrázkem a výsledkem výpočtu Sobelova operátoru:

import numpy as np
 
import scipy.datasets as datasets
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
 
# načtení matice
ascent = datasets.ascent()
 
# aplikace filtru
filtered = ndimage.sobel(ascent, axis=0)
 
# zobrazení výsledku, změna měřítka
plt.imshow(ascent - filtered, cmap="gray")
 
plt.title("Sobel operator")
 
# uložení matice do rastrového obrázku
plt.savefig("sobel_operator_3.png")
 
# zobrazení grafu
plt.show()

Výsledek:

Kombinace výsledku aplikace Sobelova operátoru s původním obrázkem.

Obrázek 13:  Kombinace výsledku aplikace Sobelova operátoru s původním obrázkem.

Autor: tisnik, podle licence: Rights Managed

Prakticky tentýž příklad, ovšem s otočeným filtrem (opět viz parametr axis=1):

import numpy as np
 
import scipy.datasets as datasets
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
 
# načtení matice
ascent = datasets.ascent()
 
# aplikace filtru
filtered = ndimage.sobel(ascent, axis=1)
 
# zobrazení výsledku, změna měřítka
plt.imshow(ascent - filtered, cmap="gray")
 
plt.title("Sobel operator")
 
# uložení matice do rastrového obrázku
plt.savefig("sobel_operator_4.png")
 
# zobrazení grafu
plt.show()

Otestování filtrů na zašuměném obrázku

Vykoušejme si nyní filtraci obrázku, který je zašuměný. Použijeme obrázek s povrchem měsíce, který jsme si ukázali již minule:

Původní obrázek s mnoha vadami.

Obrázek 14: Zdroj s mnoha vadami (zobrazte si originál!). 

Autor: tisnik, podle licence: Rights Managed

Aplikovat budeme Gaussovský filtr s hodnotou sigma rostoucí od 0,5 do 2,0:

Školení Kubernetes

import numpy as np
 
from scipy import fftpack
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
original = plt.imread("moonlanding.png").astype(float)
 
# aplikace filtru
blurred = ndimage.gaussian_filter(original, sigma=0.5)
 
# zobrazení výsledku
plt.imshow(blurred, cmap="gray")
 
# uložení matice do rastrového obrázku
plt.savefig("gaussian_filter_4.png")
 
# zobrazení grafu
plt.show()
import numpy as np
 
from scipy import fftpack
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
original = plt.imread("moonlanding.png").astype(float)
 
# aplikace filtru
blurred = ndimage.gaussian_filter(original, sigma=1)
 
# zobrazení výsledku
plt.imshow(blurred, cmap="gray")
 
# uložení matice do rastrového obrázku
plt.savefig("gaussian_filter_5.png")
 
# zobrazení grafu
plt.show()
import numpy as np
 
from scipy import fftpack
from scipy import ndimage
 
import matplotlib.pyplot as plt
 
original = plt.imread("moonlanding.png").astype(float)
 
# aplikace filtru
blurred = ndimage.gaussian_filter(original, sigma=2)
 
# zobrazení výsledku
plt.imshow(blurred, cmap="gray")
 
# uložení matice do rastrového obrázku
plt.savefig("gaussian_filter_6.png")
 
# zobrazení grafu
plt.show()

Výsledky aplikace Gaussovského filtru

Všechny následující obrázky je zapotřebí si nechat zobrazit v původní velikosti (jinak se aplikují filtry při zmenšování obrázků na plochu Roota):

Výsledek aplikace Gaussovského filtru pro hodnotu sigma=0,5.

Obrázek 15: Výsledek aplikace Gaussovského filtru pro hodnotu sigma=0,5. 

Autor: tisnik, podle licence: Rights Managed

Výsledek aplikace Gaussovského filtru pro hodnotu sigma=1.

Obrázek 16: Výsledek aplikace Gaussovského filtru pro hodnotu sigma=1.  

Autor: tisnik, podle licence: Rights Managed

Výsledek aplikace Gaussovského filtru pro hodnotu sigma=2.

 Obrázek 17: Výsledek aplikace Gaussovského filtru pro hodnotu sigma=2. 

Autor: tisnik, podle licence: Rights Managed

Repositář s demonstračními příklady

Všechny demonstrační příklady popsané v tomto článku naleznete i v repositáři https://github.com/tisnik/most-popular-python-libs. Následují odkazy na jednotlivé příklady:

# Příklad Stručný popis Adresa příkladu
1 pyproject.toml projektový soubor používaný všemi demonstračními příklady https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/pyproject.toml
       
2 help.py zobrazení nápovědy k celé knihovně SciPy https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/help.py
3 help_linalg.py zobrazení nápovědy k modulu linalg, který je součástí SciPy https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/help_linalg.py
       
4 determinant0.py nápověda k funkci linalg.det https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/determinant0.py
5 determinant1.py výpočet determinantu běžné regulární matice https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/determinant1.py
6 determinant2.py výpočet determinantu nulové matice https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/determinant2.py
7 determinant3.py výpočet determinantu singulární matice https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/determinant3.py
8 determinant4.py výpočet determinantu v oboru komplexních čísel https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/determinant4.py
9 determinant5.py výpočet determinantu singulární matice v oboru komplexních čísel https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/determinant5.py
       
10 inverse0.py nápověda k funkci linalg.inv https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/inverse0.py
11 inverse1.py výpočet inverzní matice https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/inverse1.py
12 inverse2.py výpočet inverzní matice k nulové matici https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/inverse2.py
13 inverse3.py výpočet inverzní matice k singulární matici https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/inverse3.py
14 inverse4.py výpočet inverzní matice v oboru komplexních čísel https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/inverse4.py
       
15 matrix_mul.py maticový součin založený na operátoru @ definovaného v NumPy https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/matrix_mul.py
16 matrix_mul_inv.py důkaz, že byla vypočtena korektní inverzní matice https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/matrix_mul_inv.py
17 matrix_mul_inv2.py důkaz, že byla vypočtena korektní inverzní matice v oboru komplexních čísel https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/matrix_mul_inv2.py
       
18 solve0.py zobrazení nápovědy k funkci linalg.solve https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/solve0.py
19 solve1.py vyřešení triviálního případu: jedna rovnice o jedné neznámé https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/solve1.py
20 solve2.py vyřešení systému dvou lineárních rovnic o dvou neznámých https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/solve2.py
21 solve3.py vyřešení systému tří lineárních rovnic o třech neznámých https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/solve3.py
22 solve4.py situace, která nastane, pokud je nějaká rovnice lineární kombinací jiných rovnic https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/solve4.py
23 solve5.py situace, která nastane, pokud je nějaká rovnice lineární kombinací jiných rovnic https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/solve5.py
       
20 vector_norm0.py zobrazení nápovědy k funkci linalg.norm https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/vector_norm0.py
21 vector_norm1.py výpočet výchozí normy vektoru (Eukleidovská vzdálenost) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/vector_norm1.py
22 vector_norm2.py výpočet dalších norem vektoru https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/vector_norm2.py
       
23 matrix_norm1.py výpočet norem matice: maximová a minimová norma https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/matrix_norm1.py
24 matrix_norm2.py výpočet norem matice: největší a nejmenší hodnota pro Eukleidovské vzdálenosti https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/matrix_norm2.py
25 matrix_norm3.py výpočet norem matice: největší a nejmenší hodnota pro Eukleidovské vzdálenosti https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/matrix_norm3.py
26 matrix_norm4.py výpočet norem matice: Frobeniův skalární součin https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/matrix_norm4.py
       
27 random_points.py pseudonáhodně rozmístěné body v rovině https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/random_points.py
       
28 linear_regression0.py nápověda k funkci scipy.stats.linregres https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/linear_regression0.py
29 linear_regression1.py lineární regrese pro body náhodně rozmístěné okolo úsečky https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/linear_regression1.py
30 linear_regression2.py lineární regrese, ovšem s body, které jsou blíže úsečce https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/linear_regression2.py
31 linear_regression3.py lineární regrese, ovšem s body zcela náhodně rozmístěnými po ploše https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/linear_regression3.py
       
32 cubic_spline0.py nápověda ke třídě scipy.interpolate.CubicSpline https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/cubic_spline0.py
33 cubic_spline1.py konstrukce a zobrazení kubické spline křivky https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/cubic_spline1.py
34 cubic_spline2.py konstrukce a zobrazení kubické spline křivky i její první derivace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/cubic_spline2.py
35 cubic_spline3.py konstrukce a zobrazení kubické spline křivky i její první, druhé a třetí derivace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/cubic_spline3.py
36 cubic_spline4.py čtvrtá derivace kubické spline křivky je nulová https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/cubic_spline4.py
37 cubic_spline5.py aproximace kružnice https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/cubic_spline5.py
       
38 smoothing_spline0.py nápověda k funkci scipy.interpolate.make_smo­othing_spline https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/smoothing_spline0.py
39 smoothing_spline1.py proložení bodů křivkou https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/smoothing_spline1.py
40 smoothing_spline2.py proložení bodů křivkou, větší rozptyl bodů https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/smoothing_spline2.py
41 smoothing_spline3.py nastavení různých parametrů křivky (větší počet bodů) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/smoothing_spline3.py
42 smoothing_spline4.py nastavení různých parametrů křivky (menší počet bodů) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/smoothing_spline4.py
       
43 curve_fit0.py nápověda k funkci scipy.optimize.curve_fit https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/curve_fit0.py
44 curve_fit1.py proložení bodů přímkou https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/curve_fit1.py
45 curve_fit2.py proložení bodů parabolou https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/curve_fit2.py
46 curve_fit3.py proložení bodů sinusovkou https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/curve_fit3.py
       
47 comparison1.py porovnání kubické spline a „smoothing spline“ https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/comparison1.py
48 comparison2.py porovnání kubické spline a „smoothing spline“ https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/comparison2.py
       
49 datasets0.py zobrazení nápovědy k modulu scipy.datasets https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets0.py
50 datasets1.py načtení datové sady s obrázkem ve stupních šedi https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets1.py
51 datasets2.py vizualizace testovacího obrázku v nepravých barvách https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets2.py
52 datasets3.py vizualizace testovacího obrázku ve stupních šedi https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets3.py
53 datasets4.py načtení datové sady s obrázkem v pravých barvách https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets4.py
54 datasets5.py vizualizace obrázku s převodem na stupně šedi https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets5.py
55 datasets6.py načtení datové sady s jednorozměrným signálem https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets6.py
56 datasets7.py vizualizace načteného signálu https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets7.py
57 datasets8.py základní úpravy zobrazení: výběr části signálu https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets8.py
58 datasets9.py základní úpravy zobrazení: výběr každého n-tého vzorku https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/datasets9.py
       
59 help_signal.py zobrazení nápovědy k modulu scipy.signal https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/help_signal.py
       
60 window0.py zobrazení nápovědy k modulu scipy.signal.windows https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/window0.py
61 window1.py zobrazení průběhu Hannova okna https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/window1.py
62 window2.py zobrazení průběhu trojúhelníkového okna https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/window2.py
63 window3.py zobrazení průběhu Lanczosova okna https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/window3.py
       
64 convolve_1d0.py zobrazení nápovědy k funkci scipy.signal.convolve https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_1d0.py
65 convolve_1d1.py konvoluce signálu a Hannova okna https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_1d1.py
66 convolve_1d2.py konvoluce signálu a Hannova okna: porovnání výsledku s originálem https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_1d2.py
67 convolve_1d3.py konvoluce signálu a trojúhelníkového okna https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_1d3.py
68 convolve_1d4.py porovnání dvou výsledků konvoluce https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_1d4.py
       
69 resample0.py zobrazení nápovědy k funkci scipy.signal.resample https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/resample0.py
70 resample1.py resampling jednorozměrného signálu: naivní varianta zobrazení https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/resample1.py
71 resample2.py oprava jednotek na x-ové ose po resamplingu (první přiblížení) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/resample2.py
72 resample3.py oprava jednotek na x-ové ose po resamplingu (druhé přiblížení) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/resample3.py
       
73 fft0.py zobrazení nápovědy k funkcím fft, ifft a fftshift https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft0.py
74 fft1.py rychlá Fourierova transformace pro signál se čtyřmi vzorky https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft1.py
75 fft2.py rychlá dopředná i zpětná Fourierova transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2.py
76 fft3.py rychlá Fourierova transformace periodického signálu https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft3.py
77 fft4.py zobrazení rychlé Fourierovy transformace periodického signálu https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft4.py
78 fft5.py zobrazení pozitivních složek rychlé Fourierovy transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft5.py
79 fft6.py využití funkce fftshift https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft6.py
80 fft7.py rychlá Fourierova transformace Hannova okna https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft7.py
81 fft8.py rychlá Fourierova transformace Hannova okna, výsledek zobrazen v decibelech https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft8.py
82 fft9.py korekce zobrazení výsledku Fourierovy transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft9.py
83 fft_A.py rychlá Fourierova transformace jednotkového skoku https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft_A.py
84 fft_B.py rychlá Fourierova transformace jednotkového skoku https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft_B.py
       
85 dct.c ukázka výpočtu bázových funkcí diskrétní kosinové transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct.c
       
86 fft2d0.py nápověda k rychlé 2D FFT https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d0.py
87 fft2d1.py ukázka výpočtu 2D FFT https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d1.py
88 fft2d2.py vizualizace výpočtu 2D FFT: naivní varianta https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d2.py
89 fft2d3.py vizualizace výpočtu 2D FFT: vylepšená varianta https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d3.py
90 fft2d_3B.py úprava předchozího příkladu: posun výsledku 2D FFT https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d_3B.py
91 fft2d4.py vizualizace výpočtu 2D FFT: vylepšená varianta https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d4.py
92 fft2d_4B.py úprava předchozího příkladu: posun výsledku 2D FFT https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d_4B.py
93 fft2d5.py zpětná 2D FFT https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d5.py
94 fft2d6.py úpravy obrazu ve frekvenční oblasti https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d6.py
95 fft2d7.py úpravy obrazu ve frekvenční oblasti, odlišné parametry https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d7.py
96 fft2d8.py úpravy obrazu ve frekvenční oblasti, odlišné parametry https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d8.py
97 fft2d9.py zašumění obrazu https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d9.py
98 fft2d_A.py pokus o odstranění šumu z obrazu https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d_A.py
99 fft2d_B.py pokus o odstranění šumu z obrazu (odlišný vstup) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/fft2d_B.py
       
100 dct0.py nápověda k funkci pro výpočet DCT https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct0.py
101 dct1.py výpočet diskrétní kosinové transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct1.py
102 dct2.py dopředná a zpětná kosinová transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct2.py
103 dct3.py signál, který bude transformován https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct3.py
104 dct4.py výpočet a vizualizace diskrétní kosinové transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct4.py
105 dct5.py signál, který bude transformován https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct5.py
106 dct6.py výpočet a vizualizace diskrétní kosinové transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct6.py
107 dct7.py 2D diskrétní kosinová transformace, vizualizace, lineární měřítko https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct7.py
108 dct8.py 2D diskrétní kosinová transformace, vizualizace, logaritmické měřítko https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dct8.py
       
109 dst0.py nápověda k funkci pro výpočet DST https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dst0.py
110 dst1.py výpočet a vizualizace diskrétní sinové transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dst1.py
111 dst2.py 2D diskrétní sinová transformace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/dst2.py
       
112 convolve_2d0.py nápověda k funkci convolve https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_2d0.py
113 convolve_2d1.py konvoluce s využitím jádra 3×3 prvky (rozmazání) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_2d1.py
114 convolve_2d2.py konvoluce s využitím jádra 3×3 prvky (Gaussovský filtr) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_2d2.py
115 convolve_2d3.py konvoluce s využitím jádra 3×3 prvky (hledání hran) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_2d3.py
116 convolve_2d4.py konvoluce s využitím jádra 3×3 prvky (hledání hran) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_2d4.py
117 convolve_2d5.py konvoluce s využitím jádra 3×3 prvky (Sobelův operátor) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_2d5.py
118 convolve_2d6.py konvoluce s využitím jádra 3×3 prvky (Sobelův operátor) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/convolve_2d6.py
       
119 gaussian_filter0.py nápověda k funkci ndimage.gaussian_filter https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/gaussian_filter0.py
120 gaussian_filter1.py odstranění hran Gaussovským filtrem https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/gaussian_filter1.py
121 gaussian_filter2.py odstranění hran Gaussovským filtrem (odlišná hodnota sigma) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/gaussian_filter2.py
122 gaussian_filter3.py aplikace Gaussova filtru na obrázek 6×6 pixelů https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/gaussian_filter3.py
       
123 laplace_filter0.py nápověda k funkci ndimage.laplace https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/laplace_filter0.py
124 laplace_filter1.py přímá aplikace Laplaceova filtru https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/laplace_filter1.py
125 laplace_filter2.py aplikace Laplaceova filtru, kombinace s původním obrázkem https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/laplace_filter2.py
126 laplace_filter3.py aplikace Laplaceova filtru na obrázek 6×6 pixelů https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/laplace_filter3.py
       
127 sobel_operator0.py nápověda k funkci ndimage.sobel https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/sobel_operator0.py
128 sobel_operator1.py přímá aplikace Sobelova operátoru https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/sobel_operator1.py
129 sobel_operator2.py přímá aplikace Sobelova operátoru (odlišná osa) https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/sobel_operator2.py
130 sobel_operator3.py aplikace Sobelova operátoru, kombinace s původním obrázkem https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/sobel_operator3.py
131 sobel_operator4.py aplikace Sobelova operátoru, kombinace s původním obrázkem https://github.com/tisnik/most-popular-python-libs/blob/master/scipy-lib/sobel_operator4.py

Odkazy na Internetu

  1. SciPy homepage
    https://scipy.org/
  2. SciPy (Wikipedia)
    https://en.wikipedia.org/wiki/SciPy
  3. The Hertzsprung–Russell diagram
    https://scipython.com/book2/chapter-9-data-analysis-with-pandas/problems/p92/the-hertzsprung-russell-diagram/
  4. Linear algebra (scipy.linalg)
    https://docs.scipy.org/doc/sci­py/reference/linalg.html
  5. Frequently Asked Questions – SciPy
    https://scipy.org/faq/
  6. SciPy – Introduction
    https://www.tutorialspoin­t.com/scipy/scipy_introduc­tion.htm
  7. LAPACK — Linear Algebra PACKage
    https://www.netlib.org/lapack/
  8. LAPACK (Wikipedia)
    https://en.wikipedia.org/wiki/LAPACK
  9. LAPACK na GitHubu
    https://github.com/Reference-LAPACK/lapack
  10. SciPy in Python
    https://pythonguides.com/scipy/
  11. scipy.linalg.det
    https://docs.scipy.org/doc/sci­py/reference/generated/sci­py.linalg.det.html#scipy.li­nalg.det
  12. scipy.linalg.inv
    https://docs.scipy.org/doc/sci­py/reference/generated/sci­py.linalg.inv.html#scipy.li­nalg.inv
  13. scipy.linalg.solve
    https://docs.scipy.org/doc/sci­py/reference/generated/sci­py.linalg.inv.html#scipy.li­nalg.inv
  14. Algebra
    https://cs.wikipedia.org/wiki/Algebra
  15. Lineární algebra
    https://cs.wikipedia.org/wi­ki/Line%C3%A1rn%C3%AD_alge­bra
  16. Lineární rovnice
    https://cs.wikipedia.org/wi­ki/Line%C3%A1rn%C3%AD_rov­nice
  17. Soustava lineárních rovnic
    https://cs.wikipedia.org/wi­ki/Soustava_line%C3%A1rn%C3%AD­ch_rovnic
  18. Norma matice
    https://cs.wikipedia.org/wi­ki/Norma_matice
  19. Matrix norm
    https://en.wikipedia.org/wi­ki/Matrix_norm
  20. Norma (vektoru)
    https://cs.wikipedia.org/wi­ki/Norma_(matematika)
  21. Frobeniův skalární součin
    https://cs.wikipedia.org/wi­ki/Frobeni%C5%AFv_skal%C3%A1rn%C3%AD_sou­%C4%8Din
  22. BLAS (Basic Linear Algebra Subprograms)
    https://www.netlib.org/blas/
  23. Basic Linear Algebra Subprograms (Wikipedia)
    https://en.wikipedia.org/wi­ki/Basic_Linear_Algebra_Sub­programs
  24. Operace s daty uloženými v binárních souborech v knihovnách NumPy a Pandas
    https://www.root.cz/clanky/operace-s-daty-ulozenymi-v-binarnich-souborech-v-knihovnach-numpy-a-pandas/
  25. Operace s daty uloženými v binárních souborech v knihovnách NumPy a Pandas (dokončení)
    https://www.root.cz/clanky/operace-s-daty-ulozenymi-v-binarnich-souborech-v-knihovnach-numpy-a-pandas-dokonceni/
  26. NumPy Home Page
    http://www.numpy.org/
  27. NumPy v1.10 Manual
    http://docs.scipy.org/doc/num­py/index.html
  28. NumPy (Wikipedia)
    https://en.wikipedia.org/wiki/NumPy
  29. OpenBLAS: An optimized BLAS library
    https://www.openblas.net/
  30. Integrovaná vývojová prostředí ve Fedoře: IPython a IPython Notebook
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-ipython-a-ipython-notebook/
  31. Integrovaná vývojová prostředí ve Fedoře: praktické použití IPython Notebooku a knihovny Numpy
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-prakticke-pouziti-ipython-notebooku-a-knihovny-numpy/
  32. Integrovaná vývojová prostředí ve Fedoře: praktické použití IPython Notebooku a knihovny Numpy (2.část)
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-prakticke-pouziti-ipython-notebooku-a-knihovny-numpy-2-cast/
  33. Integrovaná vývojová prostředí ve Fedoře: vykreslování grafů s využitím knihoven Numpy a matplotlib
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-vykreslovani-grafu-s-vyuzitim-knihoven-numpy-a-matplotlib/
  34. Integrovaná vývojová prostředí ve Fedoře: vykreslování grafů s využitím knihoven Numpy a matplotlib (2.část)
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-vykreslovani-grafu-s-vyuzitim-knihoven-numpy-a-matplotlib-2-cast/
  35. Piecewise linear interpolation
    https://docs.scipy.org/doc//sci­py/tutorial/interpolate/1D­.html
  36. Statistical functions (scipy.stats)
    https://docs.scipy.org/doc/sci­py/reference/stats.html
  37. scipy.stats.linregress
    https://docs.scipy.org/doc/sci­py/reference/generated/sci­py.stats.linregress.html
  38. numpy.poly1d
    https://numpy.org/doc/sta­ble/reference/generated/num­py.poly1d.html
  39. scipy.optimize.curve_fit
    https://docs.scipy.org/doc/sci­py/reference/generated/sci­py.optimize.curve_fit.html#sci­py.optimize.curve_fit
  40. scipy.interpolate.make_smoothing_spline
    https://docs.scipy.org/doc/sci­py/reference/generated/sci­py.interpolate.make_smoot­hing_spline.html#scipy.in­terpolate.make_smoothing_spli­ne
  41. Famous Curves Index
    https://mathshistory.st-andrews.ac.uk/Curves/
  42. Curve (Wikipedia)
    https://en.wikipedia.org/wiki/Curve
  43. Mathematical curves
    https://www.2dcurves.com/index.html
  44. Curves (Wolfram MathWorld)
    https://mathworld.wolfram­.com/topics/Curves.html
  45. Smooth Curve (Wolfram MathWorld)
    https://mathworld.wolfram­.com/SmoothCurve.html
  46. Spirals (Wolfram MathWorld)
    https://mathworld.wolfram­.com/topics/Spirals.html
  47. An Interactive Introduction to Splines
    https://ibiblio.org/e-notes/Splines/Intro.htm
  48. Algebraic curve
    https://en.wikipedia.org/wi­ki/Algebraic_curve
  49. Transcendental curve
    https://en.wikipedia.org/wi­ki/Transcendental_curve
  50. Algebraic Curves
    https://mathworld.wolfram­.com/topics/AlgebraicCurves­.html
  51. Elliptic Curves
    https://mathworld.wolfram­.com/topics/EllipticCurves­.html
  52. Curves we (mostly) don't learn in high school (and applications)
    https://www.youtube.com/wat­ch?v=3izFMB91K_Q
  53. Catenary arch
    https://en.wikipedia.org/wi­ki/Catenary_arch
  54. Parabolic arch
    https://en.wikipedia.org/wi­ki/Parabolic_arch
  55. Wattova křivka
    https://www.geogebra.org/m/gNh4bW9r
  56. Fifty Famous Curves, Lots of Calculus Questions, And a Few Answers
    https://elepa.files.wordpres­s.com/2013/11/fifty-famous-curves.pdf
  57. Faux, I.D. a Pratt, M.J.: Computational Geometry for Design and Manufacture,
    Ellis Horwood Ltd., Wiley & Sons, 1979
  58. Wallace A.: Differential Topology,
    Benjamin/Cummings Co., Reading, Massachussetts, USA, 1968
  59. Glossary of Bridge Terminology
    http://sdrc.lib.uiowa.edu/en­g/bridges/WaddellGlossary/Glos­sC.htm
  60. Brachistochrona
    https://cs.wikipedia.org/wi­ki/Brachistochrona
  61. Missions: Cassini
    https://solarsystem.nasa.gov/mis­sions/cassini/overview/
  62. Giovanni Domenico Cassini
    https://en.wikipedia.org/wi­ki/Giovanni_Domenico_Cassi­ni
  63. Cassini Ovals
    https://mathworld.wolfram­.com/CassiniOvals.html
  64. Geocentrismus
    https://cs.wikipedia.org/wi­ki/Geocentrismus
  65. Who was Giovanni Cassini?
    https://www.universetoday­.com/130823/who-was-giovanni-cassini/
  66. Special plane curves
    http://xahlee.info/Special­PlaneCurves_dir/ConicSecti­ons_dir/conicSections.html
  67. Interpolace
    https://mathonline.fme.vut­br.cz/pg/Algoritmy/05_APROX_KRIV­KY.htm
  68. Lagrange Polynomial Interpolation
    https://pythonnumericalmet­hods.berkeley.edu/notebook­s/chapter17.04-Lagrange-Polynomial-Interpolation.html
  69. Python Program for Lagrange Interpolation Method (with Output)
    https://www.codesansar.com/numerical-methods/python-program-lagrange-interpolation-method.htm
  70. Smooth Paths Using Catmull-Rom Splines
    https://qroph.github.io/2018/07/30/smo­oth-paths-using-catmull-rom-splines.html
  71. Lecture 11: Linear Interpolation Again – Bézier Curves
    http://www.math.kent.edu/~re­ichel/courses/intr.num.com­p.1/fall09/lecture12/bez.pdf
  72. Geometrie/Úvod do křivek
    https://cs.wikibooks.org/wi­ki/Geometrie/%C3%9Avod_do_k%C5%99i­vek
  73. B-Spline Curves and Surfaces (1)
    http://www.cad.zju.edu.cn/ho­me/zhx/GM/006/00-bscs1.pdf
  74. Praktické ukázky možností aplikace Mandelbulber při tvorbě animací
    https://www.root.cz/clanky/prakticke-ukazky-moznosti-aplikace-mandelbulber-pri-tvorbe-animaci/
  75. Kochanek–Bartels spline
    https://en.wikipedia.org/wi­ki/Kochanek%E2%80%93Bartel­s_spline
  76. class KochanekBartels
    https://splines.readthedoc­s.io/en/latest/_modules/spli­nes.html#KochanekBartels
  77. Konvoluce
    https://cs.wikipedia.org/wi­ki/Konvoluce
  78. Korelace
    https://cs.wikipedia.org/wi­ki/Korelace
  79. Fourierova transformace
    https://cs.wikipedia.org/wi­ki/Fourierova_transformace
  80. Lanczos resampling
    https://en.wikipedia.org/wi­ki/Lanczos_resampling
  81. Obrázek se schodištěm
    https://pixnio.com/people/accent-to-the-top
  82. Obrázek s mývalem
    https://pixnio.com/fauna-animals/raccoons/raccoon-procyon-lotor
  83. Sample-rate conversion
    https://en.wikipedia.org/wiki/Sample-rate_conversion
  84. Seriál Grafické formáty
    https://www.root.cz/serialy/graficke-formaty/
  85. JPEG – král rastrových grafických formátů?
    https://www.root.cz/clanky/jpeg-kral-rastrovych-grafickych-formatu/
  86. Ztrátová komprese obrazových dat pomocí JPEG
    https://www.root.cz/clanky/ztratova-komprese-obrazovych-dat-pomoci-jpeg/
  87. Programujeme JPEG: transformace a podvzorkování barev
    https://www.root.cz/clanky/pro­gramujeme-jpeg-transformace-a-podvzorkovani-barev/
  88. Programujeme JPEG: diskrétní kosinová transformace (DCT)
    https://www.root.cz/clanky/pro­gramujeme-jpeg-diskretni-kosinova-transformace-dct/
  89. Programujeme JPEG: Kvantizace DCT koeficientů
    https://www.root.cz/clanky/pro­gramujeme-jpeg-kvantizace-dct-koeficientu/
  90. Programujeme JPEG: Huffmanovo kódování kvantovaných DCT složek
    https://www.root.cz/clanky/pro­gramujeme-jpeg-huffmanovo-kodovani-kvantovanych-dct-slozek/
  91. Programujeme JPEG: Interní struktura souborů typu JFIF/JPEG
    https://www.root.cz/clanky/pro­gramujeme-jpeg-interni-struktura-souboru-typu-jfifjpeg/
  92. Programujeme JPEG: Načtení informací ze souborů typu JFIF/JPEG
    https://www.root.cz/clanky/pro­gramujeme-jpeg-nacteni-informaci-ze-souboru-typu-jfifjpeg/
  93. Programujeme JPEG: Progresivní JPEG a informace EXIF
    https://www.root.cz/clanky/pro­gramujeme-jpeg-progresivni-jpeg-a-informace-exif/
  94. The Fourier Analysis –The Fast Fourier Transform (FFT) Method
    https://www.electronics-lab.com/article/the-fourier-analysis-the-fast-fourier-transform-fft-method/
  95. Understanding the output of FFT
    https://howthefouriertran­sformworks.com/understanding-the-output-of-an-fft/
  96. What factors go into choosing DCT type 1 over type 2 or type 3 etc?
    https://dsp.stackexchange­.com/questions/31611/what-factors-go-into-choosing-dct-type-1-over-type-2-or-type-3-etc
  97. The Discrete Cosine Transform (DCT)
    https://ccrma.stanford.edu/~jos/mdft/Dis­crete_Cosine_Transform_DCT­.html
  98. Eulerův vzorec
    https://cs.wikipedia.org/wi­ki/Euler%C5%AFv_vzorec
  99. Komplexní analýza
    https://cs.wikipedia.org/wi­ki/Komplexn%C3%AD_anal%C3%BDza
  100. What is the difference between a Fourier transform and a cosine transform?
    https://dsp.stackexchange­.com/questions/13/what-is-the-difference-between-a-fourier-transform-and-a-cosine-transform
  101. Two-dimensional Discrete Cosine Transform as a Linear Transformation
    https://fairyonice.github.io/2D-DCT.html
  102. fft2 (Matlab)
    https://www.mathworks.com/hel­p/matlab/ref/fft2.html
  103. Image denoising by FFT
    https://scipy-lectures.org/intro/scipy/au­to_examples/solutions/plot_fft_i­mage_denoise.html
  104. Discrete sine transform
    https://en.wikipedia.org/wi­ki/Discrete_sine_transform
  105. Diskrétní sinová transformace: demo
    https://www.desmos.com/cal­culator/k5jlr0ykzw

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.



Nejnovější články