写个DCT版的image perceptual hash

额,好久没有写这种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方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值