需要进行归一化处理以保持图像平衡(否则任何滤镜都可能很快使图像几乎完全变成黑色或白色)。
这是一个简短易用的类,用于自动处理归一化并简化3x3矩阵的输入。
此代码遵循`imageconvolution()`函数使用的“三个数组的数组”语法,并自动计算必要的归一化除数。
<?php
class ConvolutionFilter {
public $matrix;
public $div;
public function computeDiv() {
$this->div = array_sum ($this->matrix[0]) + array_sum ($this->matrix[1]) + array_sum ($this->matrix[2]);
}
function __construct() {
$matrix = func_get_args();
$this->matrix = array( array($matrix[0], $matrix[1], $matrix[2]),
array($matrix[3], $matrix[4], $matrix[5]),
array($matrix[6], $matrix[7], $matrix[8])
);
$this->computeDiv();
}
}
?>
示例用法
<?php
$gaussianFilter = new ConvolutionFilter( 1.0, 2.0, 1.0,
2.0, 3.0, 2.0,
1.0, 2.0, 1.0 );
imageconvolution($image, $gaussianFilter->matrix, $gaussianFilter->div, 0);
?>
一些常用的滤镜
<?php
$identityFilter = new ConvolutionFilter( 0.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 0.0 );
$sharpenFilter = new ConvolutionFilter( 0.0, -1.0, 0.0,
-1.0, 5.0, -1.0,
0.0, -1.0, 0.0 );
$edgeFilter = new ConvolutionFilter( 0.0, 1.0, 0.0,
1.0, -4.0, 1.0,
0.0, 1.0, 0.0 );
$findEdgesFilter = new ConvolutionFilter( -1.0, -1.0, -1.0,
-2.0, 8.0, -1.0,
-1.0, -1.0, -1.0 );
?>
请记住,您可以使用`imagefilter()`来满足此类基本需求,但是当您想要创建自己的滤镜时,上面的类会让您更容易操作。