赞
踩
目的:使用传统的DCT对图像进行压缩,由于压缩后的信息主要集中在左上角,因此使用左上角的数据进行比较生成图像的哈希值。
实验步骤
数据预处理:双线性插值(M*M大小),高斯低通滤波,转换到YCbCr空间(只使用Y分量)
特征提取:分块(64*64);每一个块使用DCT,使用每一行和列的2-33个元素构造两个向量
P
i
1
P_i^1
Pi1 和
Q
i
1
Q_i^1
Qi1,其中列向量
Q
i
1
Q_i^1
Qi1 使用伪随机重新生成新的向量
Q
i
2
Q_i^2
Qi2;计算出
P
i
1
P_i^1
Pi1 和
Q
i
2
Q_i^2
Qi2 的L2距离
d
i
d_i
di ,通过公式计算每一个块的哈希值(记得标准化)。
h
(
i
)
=
{
0
,
d
i
<
T
1
,
O
t
h
e
r
w
i
s
e
其中
T
表示
d
排序结果的中间值
h(i) =
图像相似度:使用每张图片之间的汉明距离来判断是否相似。小于阈值则相似,否则不相似。
结论:
使用DCT后大部分数据集中在左上角;块之间进行标准化可以提升鲁棒性;使用相邻两个元素进行比较生成哈希值。
论文中实现的代码如下:
def image_hash(img_path): img = processing(img_path) C_r_list = image_feature(img) h_i = gen_hashing(C_r_list) return h_i def processing(img_path): """ input:图片的路径 output:处理后的RGB图片 """ img = cv2.imread(img_path) img = cv2.resize(img, (512,512), interpolation=cv2.INTER_LINEAR) # out = cv2.GaussianBlur(img, (3, 3),1.3) # 使用python自带的高斯滤波 kernel = np.array([[1,2,1],[2,4,2],[1,2,1]])/16 out = cv2.filter2D(img, -1 , kernel=kernel) # 二维滤波器 out = cv2.cvtColor(out, cv2.COLOR_BGR2HLS) return out def image_feature(img): """ iamge:(512,512,3) return: array格式(x,64,64) """ C_r_list = np.zeros((0,64,64)).tolist() for i in range(0,512,64): for j in range(0,512,64): image_block = img[i:i+64,j:j+64,:] C_r,C_i,C_j,C_k = QDCT(image_block) # 可以在这里取出实部和三个虚数的实部 C_r_list.append(np.sqrt(C_r**2+C_i**2+C_j**2+C_k**2).tolist()) return np.array(C_r_list) def gen_hashing(feature_matrix): """ 生成图像哈希值,和原论文不同,我的P和Q矩阵是每一行代表一个图像块。 input:array (x,64,64) output:list (x) """ d_i = [] h_i = [] P_matrix = np.zeros((0,32)).tolist() Q_matrix = np.zeros((0,32)).tolist() for i in feature_matrix: i = np.array(i) row = i[0,1:33].reshape(1,-1) column = i[1:33,0].reshape(1,-1) P_matrix.extend(row.tolist()) Q_matrix.extend(column.tolist()) P_matrix = np.array(P_matrix) Q_matrix = np.array(Q_matrix) P_matrix_1 = (P_matrix - np.mean(P_matrix,axis = 0))/np.std(P_matrix,axis = 0,ddof=1) Q_matrix_1 = (Q_matrix - np.mean(Q_matrix,axis = 0))/np.std(Q_matrix,axis = 0,ddof=1) d_i = np.sqrt(np.sum((P_matrix_1 - Q_matrix_1)**2,axis = 1)) median = np.median(d_i) for i in d_i: if i < median: h_i.append(0) else: h_i.append(1) return np.array(h_i) def QDCT(img): """ img:(64,64,3) """ # C_r = DCT(img[:,:,0]+img[:,:,1]+img[:,:,2]) * (- 1 / np.sqrt(3)) Y = cv2.cvtColor(img, cv2.COLOR_RGB2YUV)[:,:,0] V_blk = np.sum((Y-np.mean(Y))**2)/(img.shape[0]**2) C_r = cv2.dct(np.float32(img[:,:,0]+img[:,:,1]+img[:,:,2]) * (- 1 / np.sqrt(3))) C_i = cv2.dct(np.float32(img[:,:,2]-img[:,:,1]+V_blk) * (1 / np.sqrt(3))) C_j = cv2.dct(np.float32(img[:,:,0]-img[:,:,2]+V_blk) * (1 / np.sqrt(3))) C_k = cv2.dct(np.float32(img[:,:,1]-img[:,:,0]+V_blk) * (1 / np.sqrt(3))) # C_i = DCT(img[:,:,2]-img[:,:,1]) * (1 / np.sqrt(3)) # C_j = DCT(img[:,:,0]-img[:,:,2]) * (1 / np.sqrt(3)) # C_k = DCT(img[:,:,1]-img[:,:,0]) * (1 / np.sqrt(3)) return C_r,C_i,C_j,C_k def dist_img(h1,h2): return sum(np.abs(h1-h2))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。