PHP实现图片的汉明码提取与降维

作者感言:数学不好,遇到算法问题分分钟狗带,毫无转寰的余地-_-|||

最近心血来潮,看了相似图片的搜索,最最最初级的方法即提取汉明码,之后匹配汉明距离。当然,在数以亿计的汉明码中,要筛出需要的图片,计算量太大了,满足不了生产要求。作为数学小白,此时完全没折了。这时不小心看到“降维”一说,可以把降维后的哈希码存入数据库,加之分类的约束,基本满足小白初尝电商相似图片搜索的要求了:)

以下直接贴代码吧:

class DFingerPrint
{
    private $hImg=null;
    private $hTargetImg=null;
    private $arrResult=array();

    const PRINT_WIDTH=8;
    const PRINT_HEIGHT=8;

    public function __construct($imgPath)
    {
        if(file_exists($imgPath))
        {
            $ext=$this->GetExt($imgPath);
            $create_fun=‘‘;
            switch($ext)
            {
                case ‘jpg‘:
                case ‘jpeg‘:
                    $create_fun=‘imagecreatefromjpeg‘;
                    break;
                case ‘gif‘:
                    $create_fun=‘imagecreatefromgif‘;
                    break;
                case ‘png‘:
                    $create_fun=‘imagecreatefrompng‘;
                    break;
                case ‘bmp‘:
                    $create_fun=‘imagecreatefrombmp‘;
                    break;
                default:
                    $create_fun=‘imagecreatefromgd2‘;
                    break;
            }

            $this->hImg=$create_fun($imgPath);
            if($this->hImg===false) $this->hImg=null;
        }

        if($this->hImg)
        {
            $this->hTargetImg=imagecreatetruecolor(self::PRINT_HEIGHT,self::PRINT_HEIGHT);
        }
    }

    public function CalPrint()
    {
        if(!$this->hImg) return false;
        if(!$this->SizeCompress()) return false;
        if(!$this->ToGray()) return false;
        if(!($binData=$this->Binaryzation())) return false;

        //$hexData=base_convert($binData,2,16);    //这一句转出来问题,尾数错误,原因未知
        $hexData=$this->Bin2Hex($binData);

        return array(
            ‘bin‘=>$binData,
            ‘hex‘=>$hexData
        );
    }

    public function DecendDimension()    //二值降维
    {
        if(!$this->arrResult) return false;

        $binData=‘‘;
        for($x=0;$x<self::PRINT_WIDTH;$x++)
        {
            $rtl=0;
            for($y=0;$y<self::PRINT_HEIGHT;$y++)
            {
                $rtl+=$this->arrResult[$x][$y]==1?1:-1;
            }
            $binData.=$rtl>0?‘1‘:‘0‘;
        }

        $hexData=$this->Bin2Hex($binData);

        return array(
            ‘bin‘=>$binData,
            ‘hex‘=>$hexData
        );
    }

    private function SizeCompress()    //尺寸压缩
    {
        if(!$this->hImg) return false;

        imagecopyresized($this->hTargetImg,$this->hImg,0,0,0,0,8,8,imagesx($this->hImg),imagesy($this->hImg));
        return true;
    }

    private function ToGray()    //灰度化
    {
        for($x=0;$x<self::PRINT_WIDTH;$x++)
        {
            for($y=0;$y<self::PRINT_HEIGHT;$y++)
            {
                $color=imagecolorat($this->hTargetImg,$x,$y);
                $_red = ($color >> 16) & 0xff;
                $_green = ($color >> 8) & 0xff;
                $_blue = ($color) & 0xff;

                $newColor= intval(0.3 * $_red + 0.59 * $_green + 0.11 * $_blue); 

                $this->arrResult[$x][$y]=$newColor;
            }
        }
        return true;
    }

    private function Binaryzation()    //二值化
    {
        if(!$this->arrResult) return false;
        if(sizeof($this->arrResult)!=self::PRINT_WIDTH) return false;

        $totalVal=0;
        $avgVal=0;
        for($x=0;$x<self::PRINT_WIDTH;$x++)
        {
            for($y=0;$y<self::PRINT_HEIGHT;$y++)
            {
                $totalVal+=$this->arrResult[$x][$y];
            }
        }
        $avgVal=$totalVal/(self::PRINT_HEIGHT*self::PRINT_HEIGHT);

        //开始二值化
        $binData=‘‘;
        for($x=0;$x<self::PRINT_WIDTH;$x++)
        {
            for($y=0;$y<self::PRINT_HEIGHT;$y++)
            {
                if($this->arrResult[$x][$y]>=$avgVal) $this->arrResult[$x][$y]=1;
                else $this->arrResult[$x][$y]=0;

                //imagesetpixel($this->hTargetImg,$x,$y,$this->arrResult[$x][$y]==1?0xffffff:0x00);
                $binData.=strval($this->arrResult[$x][$y]);
            }
        }

        return $binData;
    }

    public function __destruct()
    {
        if($this->hImg)
        {
            imagedestroy($this->hImg);
            $this->hImg=null;
        }
        if($this->hTargetImg)
        {
            imagedestroy($this->hTargetImg);
            $this->hTargetImg=null;
        }

    }

    private function GetExt($path)
    {
        $arr=explode(‘.‘,$path);
        return strtolower($arr[sizeof($arr)-1]);
    }

    private function Bin2Hex($bin)
    {
        $hex=‘‘;
        $i=1;
        while($bin)
        {
            $tmp_bin=substr($bin,-4,4);
            $hex=base_convert($tmp_bin,2,16).$hex;

            $bin=substr($bin,0,strlen($bin)-4);
        }
        return $hex;
    }
}

调用:

$oFingerPrint=new DFingerPrint(‘1.jpg‘);
$arrHammingCode=$oFingerPrint->CalPrint();
$arrDecendCode$oFingerPrint->DecendDimension();

查看资料:

http://blog.csdn.net/lu597203933/article/details/45101859

http://blog.csdn.net/cshilin/article/details/52119682

时间: 2024-10-17 12:57:36

PHP实现图片的汉明码提取与降维的相关文章

com组件提取excel中的图片office07可以提取office13无法提取的问题

今天项目要求在公司小机房里面跑了.小机房里装的office2013 顿时我从excel中提取图片的代码就用不了了 找了一上午资料终于在stackoverflow上找到办法 贴代码: public void ReadPic(string path,List<int> noDataList) { try { if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } int count = 1; int num = 0; fo

将图片局部文字提取出来的小技巧

如何对图片中的文字内容进行识别提取呢?当图片中的文字需要编辑需改时,又该如何去操作呢?通常情况下,对于图片局部提取文字方面,我们都是借助相关OCR文字识别请添加链接描述工具来实现,下面就是具体的操作方法,有需要的朋友可以来学习一下. 步骤一.为了实现文字局部识别功能,我们需要借助百度搜索下载相关OCR文字识别工具,小编在这里使用到的是迅捷OCR文字识别软件,可通过搜索迅捷办公找到. 步骤二.打开软件,如图所示,切换到"图片局部识别"选项,点击打开文件按钮,选择需要识别的图片并打开. 步

电脑中如何提取PDF文件中的图片

通常,我们在一些PDF文件中看到一些好看的图片,想将图片保存下来,但是PDF文件是无法编辑的,在文件自身当中我们无法将图片完成的提取出来,因此大家都会想办法在不破坏图片完整性的情况下将图片从PDF文件中提取出来,下面就跟大家分享一下小编是从电脑中如何提取PDF文件中的图片.借助工具:×××换器1.在PDF文件中提取图片,本身也是一种对文件的编辑,知识PDF文件无法编辑,所以我们要借助工具来进行编辑,工具可以直接在百度浏览器中下载.2.下载安装好工具,打开工具,进入到操作页面,操作页面左边是功能栏

Java 提取Word中的文本和图片

本文将介绍通过Java来提取或读取Word文档中文本和图片的方法.这里提取文本和图片包括同时提取文档正文当中以及页眉.页脚中的的文本和图片. 使用工具:Free Spire.Doc for Java (免费版) Jar文件导入方法(参考): 方法1:下载jar文件包.下载后解压文件,并将lib文件夹下的Spire.Doc.jar文件导入到java程序.导入效果参考如下: 方法2:可通过maven导入.参考导入方法. 测试文档如下: Java代码示例(供参考) [示例1]提取Word中的文本 im

如何提取图片格式内的文字?

图片文件是我们经常遇到的文件,在我们的生活和工作中,大家有没有遇到过将图片格式中的文字提取出来的任务?今天小编就来给大家分享一种提取图片中文字的方法,希望可以帮助到大家.步骤一:在我们还没有提取图片中文字的时候,先将要进行识别的图片上传到电脑上.再在电脑上下载一款提取图片文字的工具,下载安装好之后,打开它就可以了.步骤二:在提取图片文字的工具中,我们需要选择一下要进行操作的功能,如可以进行手写文字识别图片的"手写文字识别"功能.步骤三:在手写文字识别的工具中,我们可以将就要进行识别的图

python数字图像处理(19):骨架提取与分水岭算法

骨架提取与分水岭算法也属于形态学处理范畴,都放在morphology子模块内. 1.骨架提取 骨架提取,也叫二值图像细化.这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示. morphology子模块提供了两个函数用于骨架提取,分别是Skeletonize()函数和medial_axis()函数.我们先来看Skeletonize()函数. 格式为:skimage.morphology.skeletonize(image) 输入和输出都是一幅二值图像. 例1: from s

图片里的文字转换成word

因为时间紧迫,文件又只有一份,所以只好使用拍照的方式将文件给记录下来.但是回到公司这样的文件是不能够直接给领导看的,需要转换成正规的文件格式才可以.所以需要将图片文字提取出来,试了一些网友推荐的方法都不是很好用,有的网友说直接另存为把后 缀名换成文本格式就可以,按照这样进行操作得不到想要的结果.接着又试用了网友推荐的软件,这回能够识别成功,但是识别效果真的是惨不忍睹,众多的乱码和空白得出的结果根本就不能使用.捷速pdf转换成txt转换器 正在一筹莫展的时候平时不吭声小李说话了小李是我们公司电脑工

Android(Lollipop/5.0) Material Design(五) 使用图片

官网地址:https://developer.android.com/intl/zh-tw/training/material/drawables.html#DrawableTint 以下图片的功能能帮助你在app中实现Material设计: ·图片着色 ·颜色提取 ·矢量图片 Tint Drawable Resources  为图片资源染色 在Android 5.0(API级别21)及以上,你可以将图片和9-patch定义为掩饰透明度.你能使用颜色资源(如,?android:attr/colo

爬虫实战【7】Ajax解析续-今日头条图片下载

昨天我们分析了今日头条搜索得到的信息,一直对图集感兴趣的我还是选择将所有的图片下载下来. 我们继续讲一下如何通过各个图集的url得到每个图集下面的照片. 分析图集的组成 [插入图片,某个图集的页面] 我们看上面的这个图片,右面的1/5可以看出,这个图集有5张图片,在图片上右侧点击的话,会打开下一张图片. 我们来看一下这些图片的url在哪里? 分析图集的源代码 [插入图片,图集页的XHR信息] 我们先看一下XHR,返回的仍然是一些json信息,但是每个json里面的内容都不是我们需要的图片的url