您的位置:首页 > 其它

写个DCT版的image perceptual hash

2012-12-20 15:11 162 查看
额,好久没有写这种image retrieved 的函数了

由于DCT可以把图像的低频信息保留在左上角,而高频信息则被放到右下角,而低频信息是图像中最主要的信息,比如亮度,高频信息比如边缘

这样,就可以实现一个简单的图像压缩过程

Image Perceptual Hash是图像搜索技术常用的方法,简单的说就是得到一幅图像的hash值,以方便搜索

相关的技术文档请google, wiki, 或者看paper也行

常用的DCT image perceptual hash的步骤是:

1.把图像image1 高斯滤波,resize成一个固定的尺寸的图像image2,比如32*32

2.对image2做DCT变换,得到左上角的低频信息,通常是一个8*8的区域

3.计算这个区域的中值

4.区域像素值与中值比较,大于为1,小于为0,得到一个8*8 = 64 的hash值

5.利用hash值进行图像对比,通常选用hamming distance

OVER

伪代码(OpenCV版本)

cvSmooth
cvResize
cvDCT
cvMinMaxLoc


使用OpenCV是很方便的,如果不想用cvDCT,可以自己写DCT的代码,代码并不难,最关键的是先看到DCT是怎么一个过程,系数矩阵怎么计算就可以

DCT是图像里面经常要用的东西,已经有相关的快速算法,也可以自己多线程或者GPU计算,要是嫌麻烦就凑合着用cvDCT吧

DCT coefficients:

0.354	0.354	0.354	0.354	0.354	0.354	0.354	0.354
0.49	0.416	0.278	0.0975	-0.0975	-0.278	-0.416	-0.49
0.462	0.191	-0.191	-0.462	-0.462	-0.191	0.191	0.462
0.416	-0.0975	-0.49	-0.278	0.278	0.49	0.0975	-0.416
0.354	-0.354	-0.354	0.354	0.354	-0.354	-0.354	0.354
0.278	-0.49	0.0975	0.416	-0.416	-0.0975	0.49	-0.278
0.191	-0.462	0.462	-0.191	-0.191	0.462	-0.462	0.191
0.0975	-0.278	0.416	-0.49	0.49	-0.416	0.278	-0.0975

Before DCT:

-256	-183	-110	-37	36	109	182	255
-250	-230	-190	-130	-50	50	170	255
10	15	99	200	70	0	-100	-40
20	30	200	240	88	0	-100	-40
200	180	150	109	17	0	-100	-40
171	117	73	-44	0	0	-133	-71
100	81	60	-96	-33	50	-150	-180
0	56	-35	-73	-14	-8	-15	-203

After DCT:

60.3	62.5	-100	-15.5	-6.75	-38.6	78.8	-31.4
30.7	-634	-17.9	-179	117	50	-18.5	-23.2
-266	-483	121	117	-116	-20.7	-74.1	41.9
32.7	-75.4	174	39.3	-18.5	-67.5	49.3	13.8
104	-3.02	-75.1	-53	-6.75	36.9	-53.3	-0.219
57.6	123	-156	-30.6	6.37	-1.16	66.9	-6.5
64.1	130	-65.6	-4.54	38.2	0.174	-27.6	-5.96
64.5	154	-15.1	19.6	-4.86	-7.23	5.42	-33.7
上面是一个8*8的DCT变换结果

以下是DCT-BASED image hash


1.jpg

2.jpg


005.jpg


007.jpg



008.jpg

Result:





从结果来看,这个DCT-Based pHash对图像尺寸缩放很鲁棒,但是貌似对图像抠图还是有点问题,晚上google下,看看相关的paper,应该有很多phash方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: