php识别相似图片简易版

全屏阅读
  • 基本信息

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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;
    }
}


顶一下
(0)
100%
订阅 回复
踩一下
(0)
100%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!