图像相似性搜刮的道理
%http://blog.sina.com.cn/s/blog_b27f71160101gp9c.html clear; close all; clc; srcDir=uigetdir('Choose source directory.'); cd(srcDir); allnames=struct2cell(dir('*.jpg')); [k,len]=size(allnames); FinalResult = {}; for i=1:len name=allnames{1,i}; picture1 = imread(name); picture2 = imread('006.jpg'); v=tineyesearch_ahash(picture1,picture2); FinalResult{i,1} = char('006.jgp'); FinalResult{i,2} = name; FinalResult{i,3} = v; end figure('NumberTitle','off','Name','统计表'); columnname = {'ReferenceImage','TestImage','SimilarScore'}; %各列的名称 % columnformat = {'numeric','bank','numeric'}; %各列的数据范例 columneditable = [false true true]; %各列是否是可编辑的,true是可以编辑,false是不行编辑 t = uitable('Units','normalized','Position',... [0.1 0.1 0.9 0.9],'Data',FinalResult,... 'ColumnName',columnname,... 'ColumnEditable',columneditable); 详细的代码实现,可以拜见Wote用python说话写的imgHash.py。代码很短,只有53行。行使的时辰,第一个参数是基准图片,第二个参数是用来较量的其他图片地址的目次,返回功效是两张图片之间不沟通的数据位数目(汉明间隔)。 这种算法的利益是简朴快速,不受图片巨细缩放的影响,弱点是图片的内容不能改观。假如在图片上加几个笔墨,它就认不出来了。以是,它的最佳用途是按照缩略图,找出原图。 现实应用中,每每回收更强盛的pHash算法和SIFT算法,它们可以或许辨认图片的变形。只要变形水平不高出25%,它们就能匹配原图。这些算法固然更伟大,可是道理与上面的轻盈算法是一样的,就是先将图片转化成Hash字符串,然后再举办较量。
假如图片放大或缩小,或改变纵横比,功效值也不会改变。增进或镌汰亮度或比拟度,或改变颜色,对hash值都不会太大的影响。最大的利益:计较速率快! 假如你想较量两张图片,为每张图片结构hash值而且计较差异位的个数。(汉明间隔)假如这个值为0,则暗示这两张图片很是相似,假如汉明间隔小于5,则暗示有些差异,但较量临近,假如汉明间隔大于10则表白完全差异的图片。 二、结果更佳的感知哈希算法pHash固然均值哈希更简朴且更快速,可是在较量上更古板、僵硬。它也许发生错误的裂痕,假若有一个伽马校正或颜色直方图被用于到图像。这是由于颜色沿着一个非线性标尺?-?改变个中“均匀值”的位置,并因此改变哪些高于/低于均匀值的比特数。 一个更结实的算法叫pHash,?pHash的做法是将均值的要领施展到极致。行使离散余弦调动(DCT)低落频率。 均匀哈希算法过于严酷,不足准确,更得当搜刮缩略图,为了得到更准确的功效可以选择感知哈希算法,它回收的是DCT(离散余弦调动)来低落频率的要领 1.缩小尺寸pHash以小图片开始,但图片大于8*8,32*32是最好的。这样做的目标是简化了DCT的计较,而不是减小频率。 2.简化色彩将图片转化成灰度图像,进一步简化计较劲。 3.计较DCTDCT是把图片解析频率聚积和梯状形,固然JPEG行使8*8的DCT调动,在这里行使32*32的DCT调动。 4.缩小DCT固然DCT的功效是32*32巨细的矩阵,但我们只要保存左上角的8*8的矩阵,这部门泛起了图片中的最低频率。 5.计较均匀值犹如均值哈希一样,计较DCT的均值, 6.进一步减小DCT这是最首要的一步,按照8*8的DCT矩阵,配置0或1的64位的hash值,大于便是DCT均值的设为”1”,小于DCT均值的设为“0”。功效并不能汇报我们真实性的低频率,只能大致地汇报我们相对付均匀值频率的相比拟例。只要图片的整体布局保持稳固,hash功效值就稳固。可以或许停止伽马校正或颜色直方图被调解带来的影响。 7.结构hash值将64bit配置成64位的长整型,组合的序次并不重要,只要担保全部图片都回收同样序次就行了。将32*32的DCT转换成32*32的图像。
与均值哈希一样,pHash同样可以用汉明间隔来举办较量。(只必要较量每一位对应的位置并算计差异的位的个数) 步调声名:
步调: 1.缩小图片:32 * 32是一个较好的巨细,这样利便DCT计较 2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(详细算法见均匀哈希算法步调) 3.计较DCT:DCT把图片疏散因素率的荟萃 4.缩小DCT:DCT是32*32,保存左上角的8*8,这些代表的图片的最低频率 5.计较均匀值:计较缩小DCT后的全部像素点的均匀值。 6.进一步减小DCT:大于均匀值记录为1,反之记录为0. 7.获得信息指纹:组合64个信息位,次序随意保持同等性即可。 8.比拟指纹:计较两幅图片的指纹,计较汉明间隔(从一个指纹到另一个指纹必要变屡次),汉明间隔越大则声名图片越纷歧致,反之,汉明间隔越小则声名图片越相似,当间隔为0时,声名完全沟通。(凡是以为间隔>10 就是两张完全差异的图片) 行使matlab实现 PHash 算法
clear; close all; clc; % read image I = imread('cameraman.tif'); % cosine transform and reduction d = dct2(I); d = d(1:8,1:8); % compute average a = mean(mean(d)); % set bits,here unclear whether > or >= shall be used b = d > a; % maybe convert to string: string = num2str(b(:)'); (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |