专栏首页仙士可博客php识别相似图片简易版

php识别相似图片简易版

这个识别图片的原理是分析像素点,计算平均颜色,大于平均颜色则为1,小于则为0,然后进行比对

精确度很低,只能匹配形状和比例一样的图片

class img
{
//比较图片相似度
    public function cpimg($img1, $img2, $rate = '2')
    {
        $data1 = $this->dataimg($img1);
        $data2 = $this->dataimg($img2);
        $than=$this->thanimg($data1,$data2);
        $rate=$than/(64*$rate*$rate);
        return $rate;
    }
//计算图片数据
    public function dataimg($image,$if_url=1,$rate = '2')
    {
        if($if_url) {
            $image = $this->creatimg($image);
        }
        $result = $this->imgdeflate($image);
        return $result;
    }

    /**
     * 打开一张图片
     */
    public function creatimg($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 = '2')
    {
        $width = imagesx($image);
        $height = imagesy($image);
        $n_w = 8 * $rate;//新图片宽度
        $n_h = 8 * $rate;//新图片高度
        $new = imagecreatetruecolor($n_w, $n_h);//新建一张设定真彩色宽高的图
//取出一个png图形
//copy部分图像并调整
        imagecopyresized($new, $image, 0, 0, 0, 0, $n_w, $n_h, $width, $height);
//图像输出新图片、另存为
        imagefilter($new, IMG_FILTER_GRAYSCALE);//将图片转为64级灰度
//获取每个像素的灰度值
        $total = 0;
        $array = array();
        for ($y = 0; $y < $n_h; $y++) {
            for ($x = 0; $x < $n_w; $x++) {
                $gray = (imagecolorat($new, $x, $y) >> 8) & 0xFF;
                $array[$y] = array();
                $array[$y][$x] = $gray;
                $total += $gray;
                //echo $total.'<br>';
            }
        }//平均值计算
        //echo $total.'<br>';
        $average = intval($total / (64 * $rate * $rate));
        //echo $average."<br>";
        $total = 0;
        $result = '';
        $array = array();
        for ($y = 0; $y < $n_h; $y++) {
            for ($x = 0; $x < $n_w; $x++) {
                $gra = (imagecolorat($new, $x, $y) >> 8) & 0xFF;
                $array[$y][$x] = $gra;
                if ($gra >= $average) {
                    $result .= '1';
                } else {
                    $result .= '0';
                }
            }
        }
        return $result;
    }


//进行编辑距离数值比较
    public function thanimg($data1, $data2)
    {
        $dist = 0;
        $len1 = strlen($data1);
        $len2 = strlen($data2);

        if ($len1 == 0) {
            return $len2;
        }

        if ($len2 == 0) {
            return $len1;
        }

        for ($i = 0; $i <= $len1; $i++) {
            $matrix[$i][0] = 0;
        }

        for ($j = 0; $j <= $len2; $j++) {
            $matrix[0][$j] = 0;
        }

        for ($i = 1; $i <= $len1; $i++) {
            $ch1 = $data1[$i - 1];
            for ($j = 1; $j <= $len2; $j++) {
                $ch2 = $data2[$j - 1];
                $temp = $ch1 == $ch2 ? 0 : 1;
                $arr = array(
                    $matrix[$i - 1][$j] + 1,
                    $matrix[$i][$j - 1] + 1,
                    $matrix[$i - 1][$j - 1] + $temp
                );
                $matrix[$i][$j] = min($arr);
                $val=$matrix[$i][$j];
            }
        }
        return $val;
    }
    /*
     *
     *
     * 汉明距离
     */
    public function hamimg($data1, $data2){
        $len1 = strlen($data1);
        $len2 = strlen($data2);
        if($len1 != $len2)
        {
            return false;
        }

        $dist = 0;
        for($i = 0; $i < $len1; $i++)
        {
            if($data1[$i] != $data2[$i])
            {
                $dist++;
            }
        }
        return $dist;
    }
}

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • php多数组组合计算

    仙士可
  • php自动识别背景并且把它改为白色

    本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

    仙士可
  • ecshop订单状态对应值详解

    转至 : http://www.yunmoban.cn/article-82.html

    仙士可
  • 【ICCV 2017论文集】计算机视觉顶级会议ICCV2017 Open Access Repository

    在这里先整理一些主题系列论文: ICCV 2017- 3D Vision Oral论文如下: Globally-Optimal Inlier Set Maxi...

    WZEARW
  • 【GPLT】L1-035 情人节

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • 1 行 Python 代码能干哪些事,这 13 个你知道吗?

    Python 之禅有一句话叫 “Simple is better than complex.”,简单,到底能多简单,一行代码?

    崔庆才
  • 1 行Python代码能干哪些事,这 13个你知道吗?

    来源:http://www.techug.com/post/what-can-a-line-of-python-code-do.html

    昱良
  • 几个小例子告诉你, 一行Python代码的奇淫技术

    首先你要了解一下Python之禅,一行代码输出“The Zen of Python”:

    一墨编程学习
  • ggplot实现分页画图

    一般分页绘图可以用par(nfrow()),但是这一方法在ggplot2中并不适用,ggplot2使用facet把数据按分类进行画图。

    生信编程日常
  • Ruby(1):入门

    安装:   一般来说linux会自动装ruby,可以通过:   ruby -v 来查看ruby版本   直接使用ruby命令的话,是用来执行ruby文件的。如果...

    SecondWorld

扫码关注云+社区

领取腾讯云代金券