加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

图像相似性搜刮的道理

发布时间:2021-05-14 19:53:24 所属栏目:大数据 来源:网络整理
导读:本文转自: http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html http://www.voidcn.com/article/p-nvcdxgfv-bnx.html http://blog.sina.com.cn/s/blog_b27f71160101gp9c.html http://www.voidcn.com/article/p-ojqegjmq-wy.html

%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.计较DCT

DCT是把图片解析频率聚积和梯状形,固然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(:)');


(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读