提取图像灰度信息—>利用均值哈希算法得到图像的二值编码—>计算汉明距离判断图像相似性—>得到最终检索结果
代码下载:https://download.csdn.net/download/jingjingliang1995/11120518
代码基于matlab实现:
%ahash.m
%利用均值哈希对图像进行哈希编码
%建立哈希表Tahash:
%Tahash{i, 1}:图像名字
%Tahash{i, 2}:图片哈希码
%Tahash{i, 3}:与查询图片汉明距离
clc;clear all;
path_imgDB = './database_ggjt'; %图像库路径
addpath(path_imgDB);
imgFiles = dir(path_imgDB); %读取图像库信息
imgNamList = {imgFiles(~[imgFiles.isdir]).name}; %读取图像库图片名字
clear imgFiles;
imgNamList = imgNamList';
numImg = length(imgNamList); %图片数量
%均值哈希编码
for i = 1:numImg
code_ahash=Perceptual_ahash_algorithm(imgNamList{i, 1});
Tahash{i, 1} = imgNamList{i, 1};
Tahash{i, 2} = code_ahash;
end
%计算汉明距离
quary_id = 10; %查询图像ID
quary_Code = Tahash{quary_id, 2};
for i = 1: numImg
A_dist_Hamming = xor(quary_Code, Tahash{i, 2});
dist_Hamming = sum(A_dist_Hamming(:)==1);
Tahash{i, 3} = dist_Hamming;
end
%retrieval.m
%score(:.1): 汉明距离
%score(:.2): 对应索引
score = [];
for i=1:numImg
score(i,1) = Tahash{i, 3};
end
[score, score(:,2)] = sort(score);
%显示查询图片
queryName = Tahash{quary_id, 1};
im = imread(queryName);
imquery = imresize(im, [200 200]);
figure('color',[1,1,1]);
imshow(imquery);
title('query image');
numRetrieval = 6; %返回图片数
for i = 1:numRetrieval
imName = Tahash{score(i, 2), 1};
im = imread(imName);
im = imresize(im, [200 200]);
if (ndims(im)~=3)
I2(:, :, 1, i) = im;
I2(:, :, 2, i) = im;
I2(:, :, 3, i) = im;
else
I2(:, :, :, i) = im;
end
end
%显示检索结果
figure('color',[1,1,1]);
montage(I2(:, :, :, (1:numRetrieval)));
title('search result');
%Perceptual_ahash_algorithm.m
%均值哈希算法
function A=Perceptual_hash_algorithm(str)
img=imread(str);
%转换为灰度图
temp=rgb2gray(img);
%缩小到8*8
img2=imresize(temp,[8 8]);
%划分灰度等级为64
img2=uint8(double(img2)/4);
%求均值
average=mean(mean(img2));
%生成二进制矩阵
img2(img2<average) = 0;
img2(img2>=average) = 1;
A=img2;
%将二进制转换为16进制,指纹
Str=BinToHex(A);
end
%BinToHex.m
%将哈希编码用十六进制表示
function str=BinToHex(A)
str='';
for i=1:8
for j=1:4:8
temp = dec2hex(bin2dec(num2str(A(i,j:j+3))));
str=strcat(str,num2str(temp));
end
end
end
%readme.txt
1.运行ahash得到哈希表;
2.运行retrieval得到检索结果;
实验结果:
小结:
1.这个实验使用最简单的均值哈希方法;
2.均值哈希生成的哈希码判别能力不强,检索精度不高;
3.均值哈希速度较快;