均值哈希用于图像检索(matlab)

提取图像灰度信息—>利用均值哈希算法得到图像的二值编码—>计算汉明距离判断图像相似性—>得到最终检索结果
代码下载: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.均值哈希速度较快;

猜你喜欢

转载自blog.csdn.net/jingjingliang1995/article/details/89339986
今日推荐