Filtrowanie dwuliniowe

Powiększony fragment bitmapy, w której użyto (od lewej) filtrowania najbliższego sąsiada, filtrowania biliniowego i filtrowania bikubicznego

Filtrowanie dwuliniowe, filtrowanie biliniowe (ang. bilinear filtering) – technika znana z grafiki komputerowej mająca na celu poprawę jakości wyświetlania tekstur – polega ona na obliczaniu wartości (interpolacji) pomiędzy dyskretnymi punktami w teksturze zwanymi tekselami. Dzięki tej metodzie wyświetlane tekstury stają się gładsze.

Opis metody

Wartość w punkcie P jest obliczana na podstawie dwuliniowej interpolacji pomiędzy narożnymi punktami Q

Dwuwymiarowa tekstura w grafice komputerowej najczęściej jest reprezentowana jako dwuwymiarowa tablica teksli – punktów, których atrybutem jest np. kolor. Tego typu bitmapa ma określoną rozdzielczość, a wyświetlanie jej na ekranie komputera, polega na tym, że każdemu pikselowi przydzielany jest odpowiedni teksel. Najprostszą metodą takiego mapowania jest zastosowanie metryki najbliższego sąsiada (ang. nearest neighbour), czyli dla danego piksela wybierany jest najbliższy teksel. Niestety przy powiększeniu takiej tekstury widoczne stają się prostokątne obszary reprezentujące odpowiednie teksle. Aby temu zapobiec, stosuje się filtrowanie dwuliniowe, polegające na interpolacji wartości pomiędzy punktami reprezentującymi teksele.

Niech dla danego piksela na ekranie obliczony zostanie punkt w przestrzeni tekstury. Niech odpowiednie punkty reprezentujące teksle będą znajdowały się odpowiednio w punktach oraz:

Wówczas obliczona wartość tekstury w punkcie będzie wynosić:

gdzie zaś

Przykład implementacji

W języku C procedura filtrowania dwuliniowego może zostać zaimplementowana następująco:

double getBilinearFilteredPixelColor( Texture tex, double u, double v )
{
    u *= tex.size;
    v *= tex.size;
    int x = floor(u);
    int y = floor(v);
    double u_ratio = u - x;
    double v_ratio = v - y;
    double u_opposite = 1 - u_ratio;
    double v_opposite = 1 - v_ratio;
    double result = ( tex[x][y] * u_opposite + tex[x+1][y] * u_ratio ) * v_opposite +
        ( tex[x][y+1] * u_opposite + tex[x+1][y+1] * u_ratio ) * v_ratio;
    return result;
}

Zobacz też

Bibliografia

  • Foley J.D., Van Dam A., Feiner S.K., Hughes J.F., Phillips R.L.: Introduction to Computer Graphics, Addison-Wesley Longman Publishing Co. Inc., 1994.

Media użyte na tej stronie

Image-resample-sample.png
An example of pixel interpolation. A 13x13 pixel part from an image is resampled using three algorithms. On the left, nearest neighbour sampling. In the middle, bilinear resampling. On the right, bicubic resampling. Based on an original photograph by the author mmj 01:15, 28 November 2006 (UTC), this sample hereby released into the public domain.
Bilinear interpolation.png

This picture accompanies the article on en:bilinear interpolation.

It is produced from the following en:Xfig file

#FIG 3.2  Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4      
140.00
Single
-2
1200 2
6 1020 1240 1020 1240
-6
6 1520 800 1520 800
-6
1 3 0 0 0 4 50 -1 20 0.000 1 0.0000 675 2703 45 45 675 2703 720 2703
1 3 0 0 0 4 50 -1 20 0.000 1 0.0000 2925 2703 45 45 2925 2703 2970 2703
1 3 0 0 0 1 50 -1 20 0.000 1 0.0000 1575 450 45 45 1575 450 1620 450
1 3 0 0 0 4 50 -1 20 0.000 1 0.0000 2925 450 45 45 2925 450 2970 450
1 3 0 0 0 1 50 -1 20 0.000 1 0.0000 1575 2703 45 45 1575 2703 1620 2703
1 3 0 0 0 4 50 -1 20 0.000 1 0.0000 675 450 45 45 675 450 720 450
1 3 0 0 0 13 50 -1 20 0.000 1 0.0000 1575 1080 45 45 1575 1080 1620 1080
2 1 2 1 0 7 51 -1 -1 3.000 0 0 -1 0 0 2
 225 450 3285 450
2 1 2 1 0 7 51 -1 -1 3.000 0 0 -1 0 0 2
 225 1080 3285 1080
2 1 2 1 0 7 51 -1 -1 3.000 0 0 -1 0 0 2
 225 2700 3285 2700
2 1 2 1 0 7 51 -1 -1 3.000 0 0 -1 0 0 2
 675 225 675 3150
2 1 2 1 0 7 51 -1 -1 3.000 0 0 -1 0 0 2
 1575 225 1575 3150
2 1 2 1 0 7 51 -1 -1 3.000 0 0 -1 0 0 2
 2925 225 2925 3150
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
 225 225 225 3150 3285 3150
4 0 0 50 -1 17 11 0.0000 4 135 135 2985 2633 Q\001
4 0 0 50 -1 17 11 0.0000 4 135 135 2985 380 Q\001
4 0 0 50 -1 17 11 0.0000 4 135 120 1632 380 R\001
4 0 0 50 -1 17 11 0.0000 4 135 120 1632 1013 P\001
4 0 0 50 -1 17 11 0.0000 4 135 120 1632 2633 R\001
4 0 0 50 -1 17 11 0.0000 4 135 135 738 2633 Q\001
4 0 0 50 -1 17 11 0.0000 4 135 135 738 380 Q\001
4 1 0 50 -1 17 11 0.0000 4 150 90 95 485 y\001
4 1 0 50 -1 17 11 0.0000 4 150 90 116 1120 y\001
4 1 0 50 -1 17 11 0.0000 4 150 90 95 2740 y\001
4 1 0 50 -1 17 11 0.0000 4 105 90 665 3285 x\001
4 1 0 50 -1 17 11 0.0000 4 105 90 1565 3285 x\001
4 1 0 50 -1 17 11 0.0000 4 105 90 2920 3285 x\001
4 0 0 50 -1 16 7 0.0000 4 90 75 2974 3325 2\001
4 0 0 50 -1 16 7 0.0000 4 90 75 714 3325 1\001
4 0 0 50 -1 16 7 0.0000 4 90 75 129 2800 1\001
4 0 0 50 -1 16 7 0.0000 4 90 75 129 545 2\001
4 0 0 50 -1 16 7 0.0000 4 90 75 1764 2670 1\001
4 0 0 50 -1 16 7 0.0000 4 90 75 1774 417 2\001
4 0 0 50 -1 16 7 0.0000 4 90 150 888 417 12\001
4 0 0 50 -1 16 7 0.0000 4 90 150 3130 427 22\001
4 0 0 50 -1 16 7 0.0000 4 90 150 3135 2675 21\001
4 0 0 50 -1 16 7 0.0000 4 90 150 883 2670 11\001