php识别相似图片简易版

举报
仙士可 发表于 2023/06/14 12:03:16 2023/06/14
【摘要】 这个识别图片的原理是分析像素点,计算平均颜色,大于平均颜色则为1,小于则为0,然后进行比对精确度很低,只能匹配形状和比例一样的图片class img{//比较图片相似度 public function cpimg($img1, $img2, $rate = '2') { $data1 = $this->dataimg($img1); $data2 = ...

这个识别图片的原理是分析像素点,计算平均颜色,大于平均颜色则为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;
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。