Home >Backend Development >PHP Tutorial >10万张图片,怎么找出相似的两张图片?

10万张图片,怎么找出相似的两张图片?

WBOY
WBOYOriginal
2016-06-13 12:21:341445browse

10万张图片,如何找出相似的两张图片???急急急

公司有一个项目,需要保护客户的设计信息,客户的信息都是图片,如何从10w张中找出类似的两张图片,这两张图片不来自同一台摄像机拍摄,就是长得比较像,就像是人脸识别技术一样,如何才能实现找出相似的呢,比一定是相似的两张,可以是相似的多张图片,后期我们会进行人工对比的?

------解决思路----------------------
/**<br /> * 生成指纹<br /> * $filename 图片文件名,可以是URL。只能是GD支持的图片类型<br /> * $k 采样点阵数<br /> * $retmode 返回格式:0 二进制表示 1 数组 2 十六进制表示<br /> **/<br />function produceFingerPrint($filename, $k=8, $retmode=0) {<br />  $sim = imagecreatefromstring( file_get_contents($filename) );<br />  $dim = imagecreate($k, $k);<br />  imagecopyresized($dim, $sim, 0, 0, 0, 0, $k, $k, imagesx($sim), imagesy($sim));<br />  imagetruecolortopalette($sim, true, 64);<br />  //imagefilter($sim, IMG_FILTER_GRAYSCALE);<br /><br />  for($x=0; $x<$k; $x++) for($y=0; $y<$k; $y++) {<br />    $c = imagecolorat($dim, $x, $y);<br />    $p[] = array_sum( imagecolorsforindex($dim, $c))/3;<br />  }<br />  $avl = array_sum($p)/count($p);<br />  $r = '';<br />  foreach($p as $v) $r .= $v>=$avl ? 1 : 0;<br /><br />  if($retmode == 0) return $r;<br />  $p = array_map('bindec', str_split($r, 8));<br />  if($retmode == 1) return $p;<br />  if($retmode == 2) {<br />    array_unshift($p, '%02x%02x%02x%02x%02x%02x%02x%02x');<br />    return call_user_func_array('sprintf', $p);<br />  }<br />  return false;<br />}<br />

用此函数对每个图片生成指纹,保存到数据库备用

检查时,指纹相同的就视为图片相同,这不必说
相似度计算
$p1 = produceFingerPrint($f1, $k);<br />$p2 = produceFingerPrint($f2, $k);<br />$n = count(array_diff_assoc(str_split($p1), str_split($p2)));<br />echo 1 - $n / strlen($p1);<br />

------解决思路----------------------
相似度(一个小于等于1的值),阀值由你自己决定
一般认为
0.95 很相似
0.9 相似
0.85 相似
再小就不算相似了
------解决思路----------------------
相似度我测试过,相片的拍摄角度,明暗度对相似度影响很大!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:这么写为啥不对Next article:Thinkphp入门 2 (46)