php自动识别背景并且把它改为白色

时间:2020-05-29
本文章向大家介绍php自动识别背景并且把它改为白色,主要包括php自动识别背景并且把它改为白色使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

此源码有个阈值可以自己调节,精确度等自测

<?php
/*$Colorimg = new Colorimg();
$image=$Colorimg->IMGaction("G:/www/20161220/demo/5.jpg",1,1,50);
//告诉浏览器以图片形式解析
header('content-type:image/jpeg');
imagejpeg($image, "G:/www/20161220/demo/3.jpg");
*/
 
class Colorimg
{
    public $image;//图片
    private $cs;//比对阈值
    public function IMGaction($imgurl,$if_url=1,$if_deflate=0,$cs='50') {
        if($if_url==1) {
            $image $this->ImgcolorCRRATE($imgurl);
        }else{
            $image $imgurl;
        }
        if($if_deflate==1) {
            $image $this->ImgDEFLATE($image);
        }
        //平均值
        $sample $this->ColorGETMEANrgb($image);
 
       $image=$this->ImgsetPIXEL($image,$sample,$cs);
 
        return $image;
 
    }
    /**
     * 打开一张图片
     */
    public function ImgcolorCRRATE($image)
    {
        list($width$height) = getimagesize($image);//获取图片信息
        $img_info getimagesize($image);
        switch ($img_info[2]) {
            case 1:
                $img = imagecreatefromgif($image);
                break;
            case 2:
                $img = imagecreatefromjpeg($image);
                break;
            case 3:
                $img = imagecreatefrompng($image);
                break;
        }
        return $img;
    }
 
    /**
     * $rate为图片长宽最大值
     */
    public function ImgDEFLATE($image$rate '800')
    {
        $w = imagesx($image);
        $h = imagesy($image);
//指定缩放出来的最大的宽度(也有可能是高度)
        $max $rate;
//根据最大值为300,算出另一个边的长度,得到缩放后的图片宽度和高度
        if ($w $h) {
            $w $max;
            $h $h * ($max / imagesx($image));
        else {
            $h $max;
            $w $w * ($max / imagesy($image));
        }
//声明一个$w宽,$h高的真彩图片资源
        $i = imagecreatetruecolor($w$h);
 
//关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
        imagecopyresampled($i$image, 0, 0, 0, 0, $w$h, imagesx($image), imagesy($image));
        return $i;
    }
 
    /**
     * 传入多维数组n个点计算平均值
     *$rgbarrays=array(
     * $rgb1=array(
     * 'r'=>255,
     * 'g'=>255,
     * 'b'=>255
     * )
     * )
     */
    public function ColorRECKmean($rgbarrays)
    {
//获取总共几个点
        $sum count($rgbarrays);
        $mean1['r'] = '';
        $mean1['g'] = '';
        $mean1['b'] = '';
        foreach ($rgbarrays as $rbg) {
            $mean1['r'] += $rbg['r'];
            $mean1['g'] += $rbg['g'];
            $mean1['b'] += $rbg['b'];
        }
        $mean['r'] = intval($mean1['r'] / $sum);
        $mean['g'] = intval($mean1['g'] / $sum);
        $mean['b'] = intval($mean1['b'] / $sum);
        return $mean;
    }
 
    /**
     * 取四个点,返回平均点的rgb数组
     */
    public function ColorGETMEANrgb($image)
    {
        $rgb1 = imagecolorat($image, 0, 0);
        $rgb2 = imagecolorat($image, 0, imagesy($image) - 1);
        $rgb3 = imagecolorat($image, imagesx($image) - 1, 0);
        $rgb4 = imagecolorat($image, imagesx($image) - 1, imagesy($image) - 1);
//平均值
        $sample $this->ColorRECKmean(array($this->ColorRGBresolved($rgb1)), $this->ColorRGBresolved($rgb2), $this->ColorRGBresolved($rgb3), $this->ColorRGBresolved($rgb4));
        return $sample;
    }
 
    public function ImgsetPIXEL($image,$sample,$cs){
        //如果相似就加一个白色的点
        for ($x = 0; $x < imagesx($image); $x++) {
            for ($y = 0; $y < imagesy($image); $y++) {
                $rgb = imagecolorat($image$x$y);
                $than $this->ColorTHANrgb($this->ColorRGBComp($this->ColorRGBresolved($rgb), $sample),$cs);
                if ($than) {
                    $color = imagecolorallocate($image, 255, 255, 255);
                    imagesetpixel($image$x$y$color);
                }
            }
        }
        return $image;
    }
 
    /**
     * 比对颜色相似度
     * $rgb1和$rgb2必须数组$rgb['r']....
     */
    public function ColorRGBComp($rgb1$rgb2)
    {
        $tbsr abs($rgb1['r'] - $rgb2['r']);
        $tbsg abs($rgb1['g'] - $rgb2['g']);
        $tbsb abs($rgb1['b'] - $rgb2['b']);
        $cv = sqrt(pow($tbsr, 2) + pow($tbsg, 2) + pow($tbsb, 2));
        return $cv;
    }
    /**
     *把rgb颜色分解成数组
     *
     */
    function ColorRGBresolved($rgb)
    {
        $img['r'] = intval(($rgb >> 16) & 0xFF);
        $img['g'] = intval(($rgb >> 8) & 0xFF);
        $img['b'] = intval(($rgb) & 0xFF);
        return $img;
    }
 
    /**
     * 对比像素是否相似,相似返回true
     */
    public function ColorTHANrgb($cv$cs)
    {
        if ($cv <=$cs) {
            return true;
        else {
            return false;
        }
    }
}

原文地址:https://www.cnblogs.com/myJuly/p/12986501.html