PHP/GD:更好的高斯模糊

Posted

技术标签:

【中文标题】PHP/GD:更好的高斯模糊【英文标题】:PHP/GD : Better Gaussian blur 【发布时间】:2011-08-30 15:28:06 【问题描述】:

我想用 GD 库模糊图像,不幸的是 GD 提供的 GAUSSIAN_BLUR 效果还不够,我想要一些更模糊

<?php $im = imagecreatefrompng($_GET['image']);
if($im && imagefilter($im, IMG_FILTER_GAUSSIAN_BLUR))

  header('Content-Type: image/png');
    imagepng($im);

else

    echo 'fail';


imagedestroy($im);

我想要这样的东西,或者至少接近它。

【问题讨论】:

【参考方案1】:

遇到同样的问题后,我多次应用相同的过滤器,每次都应用到上一次“imagefilter”调用的结果资源。我得到了您正在寻找的“更模糊”效果。

例如:

for ($x=1; $x<=15; $x++)
   imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);

【讨论】:

我自己使用过它,所以我可以向您保证它可以按预期工作。 这个我用过,但是速度慢得让人难以忍受。 虽然很慢但是我还在用它【参考方案2】:

你可以试试卷积:

$gaussian = array(array(1.0, 2.0, 1.0), array(2.0, 4.0, 2.0), array(1.0, 2.0, 1.0));
imageconvolution($image, $gaussian, 16, 0);

$gaussian 是一个矩阵,所以在数学上它是

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

您可以在以下位置找到其他卷积过滤器:http://aishack.in/tutorials/image-convolution-examples/

imageconvolution( <image element>, <convolution matrix>, <divisor (sum of convolution matrix)>, <color offset>);

所以从上面的代码1+2+1+2+4+2+1+2+1 = 16 矩阵的总和。 http://www.php.net/manual/en/function.imageconvolution.php#97921 是获得 除数之和。

查看http://php.net/manual/en/function.imageconvolution.php 了解有关此功能的更多信息。

不错的时尚模糊是 (1,2,1),(2,1,2),(1,2,1)

编辑: as stated below 您可以在结果输出上多次运行任何过滤器以增强效果。

【讨论】:

不接近我想要的,但是谢谢,还有其他方法可以使它更加模糊吗?编辑:抱歉没有阅读您的编辑,查看示例,谢谢! 看起来像这个矩阵:array(2.0, 3.0, 2.0), array(3.0, 6.0, 3.0), array(2.0, 3.0, 2.0) 是这个函数可以读取的最大矩阵,我'读过 5x5 矩阵可以做更好更强的模糊,有什么想法吗? 多次使用该函数得到了我想要的结果,但它不是最好的解决方案肯定 不知道为什么 PHP 不允许更大的矩阵,可能是 GD 限制我知道 IMagick 需要 5x5 的......如果你有 adobe photoshop 使用过滤器>自定义让你玩卷积。 ImageMagick 与 GD 相比不是一个好的选择,GD 几乎安装在每个服务器上,不像 ImageMagick....有任何选项可以规避函数重复吗??【参考方案3】:

试试这个:

<?php
//
//fastblur function from image hosting and processing site http://hero-in.com
//

function blur($img, $radius=10)


if ($radius>100) $radius=100; //max radius
if ($radius<0) $radius=0; //nin radius

$radius=$radius*4;
$alphaStep=round(100/$radius)*1.7;
$width=imagesx($img);
$height=imagesy($img);
$beginX=floor($radius/2);
$beginY=floor($radius/2);


//make clean imahe sample for multiply
$cleanImageSample=imagecreatetruecolor($width, $height);
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height);


//make h blur
for($i = 1; $i < $radius+1; $i++)

$xPoint=($beginX*-1)+$i-1;
imagecopymerge($img, $cleanImageSample, $xPoint, 0, 0, 0, $width, $height, $alphaStep);

//make v blur
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height);
for($i = 1; $i < $radius+1; $i++)

$yPoint=($beginY*-1)+$i-1;
imagecopymerge($img, $cleanImageSample, 0, $yPoint, 0, 0, $width, $height, $alphaStep);

//finish
return $img;
imagedestroy($cleanImageSample); 


//example
$im = ImageCreateFromJpeg('image.jpg');
$im = blur($im,10);
imagejpeg($im)
imagedestroy($im);
?>

【讨论】:

【参考方案4】:

基于this 解决方案的以下代码我得到了很好的结果:

    for ($i = 0; $i < 25; $i++) 
        if ($i % 10 == 0) //each 10th time apply 'IMG_FILTER_SMOOTH' with 'level of smoothness' set to -7
            imagefilter($tmp_dst_image, IMG_FILTER_SMOOTH, -7);
        
        imagefilter($tmp_dst_image, IMG_FILTER_GAUSSIAN_BLUR);
    

当您在多次模糊后应用平滑时,它会提供非常好的模糊效果。您可以在代码中试验以下数字:25, 10, -7

另请参阅: How to measure the speed of code written in PHP

【讨论】:

【参考方案5】:

不确定 imagefilter 参数是否有帮助,但请检查一下。

或者,只需将图像过滤器应用于其结果几次???

【讨论】:

【参考方案6】:

为了更快的速度使用https://www.php.net/manual/tr/function.imagick-gaussianblurimage.php

注意:您需要安装Imagick php 扩展(按照here 的安装说明进行操作

例子

header('Content-type: image/jpeg');
$image = new Imagick('https://i.dr.com.tr/cache/600x600-0/originals/0000000671636-1.jpg');

// Use gaussianBlurImage function 
$image->gaussianBlurImage(7, 5);

// Display the output image 
echo $image;

【讨论】:

以上是关于PHP/GD:更好的高斯模糊的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发探索-高斯模糊&毛玻璃效果

android 高斯模糊怎么还原

android能对背景做高斯模糊么

【iOS开发】生成高斯模糊效果背景

webgl智慧楼宇发光效果算法系列之高斯模糊

模糊处理(下)--高斯模糊,双边模糊以及实现一个简单的磨皮美颜效果(opencv学习记录--4)