Фильтр «Свертка»

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Класс ConvolutionFilter можно использовать для применения к объектам BitmapData и экранным объектам широкого спектра графических преобразований, таких как размытие, выделение краев, усиление резкости, тиснения и фаски.

Фильтр свертки обрабатывает пикселы исходного изображения один за другим и определяет финальный цвет пиксела с помощью значения пиксела и пикселов, которые его окружают. Матрица, заданная как массив числовых значений, указывает, до какой степени значение каждого из окружающих пикселов влияет на финальный результат.

Рассмотрим наиболее часто используемый тип матрицы 3 х 3. Эта матрица включает девять значений:

N    N    N 
N    P    N 
N    N    N

Когда фильтр свертки применяется к определенному пикселу, программа учитывает значение цвета самого пиксела (в данном примере это «P»), а также значения окружающих пикселов (в данном примере это «N»). Однако путем установки значений в матрице вы указываете приоритет, который имеют те или иные пикселы при воздействии на финальное изображение.

Например, следующая матрица, которая применена с использованием фильтра свертки, оставит изображение совершенно без изменений:

0    0    0 
0    1    0 
0    0    0

Причина неизменности изображения состоит в том, что значение исходного пиксела имеет относительную силу 1 при определении финального цвета пиксела, тогда как значения окружающих пикселов имеют относительную силу 0. Это означает, что их цвета не влияют на финальное изображение.

Точно так же эта матрица вызовет сдвиг пикселов изображения на один пиксел влево:

0    0    0 
0    0    1 
0    0    0

Учтите, что в данном случае сам пиксел не влияет на финальное значение пиксела, отображенного на этой позиции в финальном изображении. Для определения конечного результата пиксела применяется только значение пиксела справа.

В ActionScript матрица создается как сочетание экземпляра Array, содержащего значения, и двух свойств, указывающих количество строк и столбцов в матрице. В следующем примере загружается изображение, и по завершении загрузки к изображению применяется фильтр свертки с помощью матрицы в предыдущем примере:

// Load an image onto the Stage. 
var loader:Loader = new Loader(); 
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg"); 
loader.load(url); 
this.addChild(loader); 
 
function applyFilter(event:MouseEvent):void 
{ 
    // Create the convolution matrix. 
    var matrix:Array = [0, 0, 0, 
                                     0, 0, 1, 
                                     0, 0, 0]; 
     
    var convolution:ConvolutionFilter = new ConvolutionFilter(); 
    convolution.matrixX = 3; 
    convolution.matrixY = 3; 
    convolution.matrix = matrix; 
    convolution.divisor = 1; 
     
    loader.filters = [convolution]; 
} 
 
loader.addEventListener(MouseEvent.CLICK, applyFilter);

В этом коде есть нечто неочевидное, а именно применение значений, отличных от 1 или 0 в матрице. Например, одна и та же матрица с числом 8 вместо 1 на правой позиции выполняет то же самое действие (сдвигает пикселы влево). Кроме того, она оказывает влияние на цвета изображения, усиливая их яркость в 8 раз. Это происходит потому, что финальные значения цвета пикселов рассчитываются путем умножения матричных значений на значения исходного цвета пикселов, сложения этих значений и деления на значение свойства divisor фильтра. Учтите, что в коде примера свойству divisor присвоено значение 1. Общее правило состоит в том, что если вы хотите, чтобы яркость цветов оставалась примерно такой же, что и в исходном изображении, необходимо приравнять делитель к сумме значений матрицы. Поэтому если значения матрицы составляют 8, а делитель равен 1, финальное изображение будет примерно в 8 раз ярче исходного.

Хотя воздействие этой матрицы не очень заметно, для создания различных эффектов можно использовать другие значения матрицы. Ниже приводятся несколько стандартных наборов значений матрицы 3 х 3 для различных эффектов.

  • Основное размытие (делитель 5):

         0 1 0 
         1 1 1 
         0 1 0
  • Усиление резкости (делитель 1):

         0, -1, 0 
        -1, 5, -1 
         0, -1, 0
  • Выделение краев (делитель 1):

         0, -1, 0 
        -1, 4, -1 
         0, -1, 0
  • Эффект выдавливания (делитель 1):

        -2, -1, 0 
        -1, 1, 1 
         0, 1, 2

    Обратите внимание, что в большинстве этих эффектов делитель равен 1. Это происходит потому, что сложение отрицательных и положительных значений матрицы приводит к результату равному 1 (или 0 в случае выделения краев, но значение свойства divisor не может быть равно 0).