写个DCT版的image perceptual hash

来源:互联网 发布:深入浅出学java 编辑:程序博客网 时间:2024/06/14 02:25

额,好久没有写这种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版本)

cvSmoothcvResizecvDCTcvMinMaxLoc

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

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

DCT coefficients:0.3540.3540.3540.3540.3540.3540.3540.3540.490.4160.2780.0975-0.0975-0.278-0.416-0.490.4620.191-0.191-0.462-0.462-0.1910.1910.4620.416-0.0975-0.49-0.2780.2780.490.0975-0.4160.354-0.354-0.3540.3540.354-0.354-0.3540.3540.278-0.490.09750.416-0.416-0.09750.49-0.2780.191-0.4620.462-0.191-0.1910.462-0.4620.1910.0975-0.2780.416-0.490.49-0.4160.278-0.0975Before DCT:-256-183-110-3736109182255-250-230-190-130-5050170255101599200700-100-402030200240880-100-40200180150109170-100-4017111773-4400-133-711008160-96-3350-150-180056-35-73-14-8-15-203After DCT:60.362.5-100-15.5-6.75-38.678.8-31.430.7-634-17.9-17911750-18.5-23.2-266-483121117-116-20.7-74.141.932.7-75.417439.3-18.5-67.549.313.8104-3.02-75.1-53-6.7536.9-53.3-0.21957.6123-156-30.66.37-1.1666.9-6.564.1130-65.6-4.5438.20.174-27.6-5.9664.5154-15.119.6-4.86-7.235.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方法

原创粉丝点击