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."
";

}

}//平均值计算

//echo $total."
";

$average = intval($total / (64 * $rate * $rate));

//echo $average."
";

$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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值