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