Strona głównaArtykułyFotografia Obliczeniowa

Filtry Obrazu: Konwolucja, Krawędzie Sobela i Rozmycie Gaussa

Rozmyj, wyostrz, wykrywaj krawędź – niemal każdy klasyczny filtr obrazu to ta sama operacja, konwolucja, z różnym małym siatką liczb.

mysimulator teamZaktualizowano — czerwiec 2026≈ 8 min czytania▶ Otwórz symulację

Konwolucja: jedna operacja, setki filtrów

Konwolucyjny rdzeń to maza siatka liczb – często 3x3 lub 5x5 – która przesuwa się po każdym pikselu obrazu. W każdej pozycji mnoży wartość rdzenia przez odpowiadającą jej wartość piksela, sumuje iloczyny i zapisuje tę sumę jako nową wartość centralnego piksela. Rozmycie, wyostrzanie, embossowanie i wykrywanie krawędzi to wszystko dokładnie ta sama operacja z przesuwającym się oknem – zmieniają się jedynie liczby w rdzeniu.

output(x,y) = Σ Σ  kernel(i,j) · input(x+i, y+j)     for i,j in the kernel's footprint

3x3 box blur kernel (each weight = 1/9):     3x3 sharpen kernel:
  1/9  1/9  1/9                                0  -1   0
  1/9  1/9  1/9                               -1   5  -1
  1/9  1/9  1/9                                0  -1   0
demo na żywo · powiązana symulacja● LIVE

Rozmycie Gaussa: ważenie sąsiedztwa w zależności od odległości

Rozmycie pudełkowe (równoważne wagi) wygładza obraz, ale generuje widoczne artefakty kwadratowe. Rozmycie Gaussa zamiast tego ważę sąsiednie piksele za pomocą funkcji 2D Gaussa (normalny rozkład), dzięki czemu piksele blisko środka mają znacznie większą wagę niż te oddalone, co skutkuje naturalnym, gładkim wykończeniem bez artefaktów kierunkowych:

G(x, y) = (1 / (2πσ²)) · exp( -(x² + y²) / (2σ²)) σ (sigma) kontroluje promień rozmycia – większe σ = szerszy jądro = silniejsze rozmycie. Ponieważ 2D Gauss jest rozkładalny – dokładnie rozkłada się na pionowy 1D Gauss pomnożony przez poziomy 1D Gauss – implementacja nigdy nie oblicza pełnego 2D jądra. Rozmywa każdy wiersz za pomocą jednego przejścia 1D, a następnie rozmywa każdy kolumnę tego wyniku tym samym przejściem 1D, co przekształca koszt O(k²) na piksel w koszt O(2k), dlatego rozmycie Gaussa pozostaje szybkie nawet przy dużych promieniach.

G(x, y) = (1 / (2πσ²)) · exp( -(x² + y²) / (2σ²) )

σ (sigma) controls the blur radius — larger σ = wider kernel = stronger blur

Sobel: przekształcanie zmian w natężności na mapę krawędzi

Krawędź, z definicji, jest miejscem, gdzie natężenie pikseli zmienia się gwałtownie. Operator Sobela (1968) przybliża gradient obrazu za pomocą dwóch małych jąder, jedno wrażliwe na zmiany poziome, a drugie na pionowe:

Gx (gradient poziomy): Gy (gradient pionowy): -1 0 +1 -1 -2 -1 -2 0 +2 0 0 0 -1 0 +1 +1 +2 +1 natężenie krawędzi = sqrt(Gx² + Gy²) direkcja krawędzi = atan2(Gy, Gx) Przechodząc przez każdy piksel i łącząc obie jądra, otrzymujemy mapę siły krawędzi, która oświetla wszędzie tam, gdzie natężenie zmienia się ostro w dowolnym kierunku – podstawa dla bardziej zaawansowanego detektora krawędzi Canny, który najpierw dodaje rozmycie Gaussa (aby tłumić szumy, ponieważ szum wygląda jak fałszywe, drobne krawędzie do Sobela), następnie stosuje nie-maksymalną tłoczenie, aby wygładzić krawędzie do pojedynczych pikseli linii, a ostatecznie używa dwuetapowego hysteresis z progami, aby zachować tylko prawdziwe, ciągłe łańcuchy krawędzi.

Gx (horizontal gradient):        Gy (vertical gradient):
 -1   0  +1                       -1  -2  -1
 -2   0  +2                        0   0   0
 -1   0  +1                       +1  +2  +1

edge magnitude = sqrt(Gx² + Gy²)
edge direction = atan2(Gy, Gx)

Kiedy filtrowanie w dzymie częstotliwości jest szybsze

Bezpośrednia konwolucja obrazu o n pikselach z jądrem o wymiarach k x k kosztuje O(n · k²) – każdy pikiel wyjściowy wymaga k² mnożeń-dodatków. Twierdzenie o konwolucji mówi, że konwolucja w dziedzinie przestrzennej jest równoważna prostemu mnożeniu elementarnego w dziedzinie częstotliwości, więc obraz można przekształcić za pomocą 2D szybkiej transformaty Fouriera (O(n log n)), pomnożyć go punkt po punkcie przez transformatę jądra i przekształcić z powrotem. Dla małego jądra Sobela o wymiarach 3x3 to nie opłaca się – stały narzut na trzy FFT dominują – ale dla dużych jąder, w przybliżeniu powyżej 20 do 30 pikseli szerokości, filtrowanie oparte na FFT staje się znacznie szybsze, ponieważ jego koszt nie rośnie wraz z rozmiarem jądra tak jak w przypadku bezpośredniej konwolucji.

Frequently asked questions

Dlaczego operator Sobela używa dwóch jąder zamiast jednego?

Ponieważ krawędź może przebiegać w dowolnym kierunku, a pojedyncze jądro reaguje silnie tylko z gradientami ułożonymi pod kątem do niego. Sobel wykorzystuje jedno jądro dostrojone do zmian intensywności poziomej (Gx) i drugie do zmian pionowych (Gy), a następnie łączy je, obliczając wartość bezwzględną jako sqrt(Gx^2 + Gy^2), aby uzyskać niezależną od kierunku siłę krawędzi, oraz atan2(Gy, Gx) w celu odzyskania orientacji krawędzi, jeśli jest to konieczne.

Dlaczego rozmycie Gaussa jest używane do redukcji szumów przed wykrywaniem krawędzi?

Detektory krawędzi działają poprzez wzmacnianie szybkich zmian intensywności, a losowy szum pikselowy to również szybka, wysokiej częstotliwości zmiana. Dlatego bezpośrednie zastosowanie operatora Sobela lub podobnego do obrazu zaszumionego generuje pole fałszywych, małych 'krawędzi' spowodowanych szumem, zagłuszając prawdziwe krawędzie. Rozmycie Gaussa jest filtrem o niskiej częstotliwości: wygładza wysokie częstotliwości szumu, przy zachowaniu w większości integralności autentycznych, większych skal krawędzi, dlatego prawie każdy praktyczny detektor krawędzi, w tym algorytm Canny, rozmywa obraz najpierw.

Kiedy filtrowanie obrazu za pomocą FFT jest szybsze niż bezpośrednia konwolucja?

Bezpośrednia konwolucja kosztuje O(n·k^2) dla obrazu o wymiarach n pikseli i jądra o wymiarach k x k, podczas gdy filtrowanie oparte na FFT kosztuje O(n log n) niezależnie od rozmiaru jądra, ponieważ konwolucja w domenie przestrzennej staje się prostym mnożeniem w domenie częstotliwości. Dla małych jąder, takich jak operator Sobela 3x3, bezpośrednia konwolucja wygrywa, ponieważ nadmiar kosztów dwóch FFT i odwrotnej FFT nie jest wart opłaty; dla dużych jąder, szacunkowo powyżej około 20 do 30 pikseli szerokości, podejście oparte na FFT staje się szybsze.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Image Filters i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację Image Filters

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)