接下来学习的是关于图像检索方面的知识。
图像检索系统:随着网络技术的快速发展,许多领域使用图像来表达它们想要传递的信息。因此,数字图像和计算机视觉的结合已经成为大数据时代的一个重要研究领域,使用户能够准确地找到他们需要的图像。对于一个图像检索系统来说,信息获取的准确性、快速性和有效性是最重要的。
传统的图像检索是以文本查询为基础,然后通过提取关键词特征与信息库进行匹配来检索,这种方法费时费力,效率低下,受主观影响大。在20世纪90年代早期,基于内容的图像检索被提出,使传统检索方法所具有的困难得到解决,目前已经广泛应用于各种研究领域。
基于内容的图像检索的核心是将提取的图像本身的颜色、纹理、形状及空间关系等视觉特征作为图像的内容,通过相似性查询达到检索的目的。它从本质上讲是一种近似匹配技术,融合了多个领域的成果,主要包括三方面:一是分析和转化用户需求,可以在检索索引数据库进行检索;二是对收集的图像资源提取特征,建立图像索引数据库;三是采用相似度算法对用户待检索图像与检索索引数据库进行相似度大小计算,将满足阈值的结果按照相似度降序排列输出给用户。
相似度匹配是图像检索过程中的一个重要环节,对同一种特征提取方法来说可能通过使用不同的相似性测量方法所得到的结果也大不相同,因此选择合适的匹配方法进行图像检索非常重要。相似度匹配是指计算出待检索图像特征与图像检索库中的图像特征之间的异同,并依据相似度算法计算结果,确定图像的相似度,并对其进行排序后输出。
- 欧氏距离
欧氏距离的定义为两点之间的真实距离,是一种应用广泛的相似性匹配算法,其计算的距离结果d与图像的相似性成反比。欧氏距离的定义如下式所示:
- 直方图相交距离
直方图相交距离指分别计算图像A和B两幅图像的直方图,然后再计算这两个直方图的归一化相关系数。
设A,B表示两个含有k个bin的直方图,其分量分别用A(i),B(i)表示,则它们的相交距离d为
其中,
将上式求得的直方图相交距离进行归一化处理,计算两个直方图的归一化相关系数,即:
上式中d的取值范围为[0,1],d的值与图像相似性成正比。
得到所有图像历史特征数据库的代码
function [ DataBaseFeatures ] = HistFeatureExtraction( NumOfImg,FileName )
%UNTITLED2 此处显示有关此函数的摘要
% 此处显示详细说明
ImagePath = 'E:\MATLAB\R2018a\bin\jiansuotupianku\';% 图像文件夹路径
DATA=xlsread('数据(对应检索图片库).xlsx');
NumOfImg=92;
for n =1:NumOfImg
FileName=['',num2str(n),'.bmp'];
ImageRead=imread([ImagePath,FileName]);
ImageRead = ImageRead(:,:,1:3); %读取图像RGB值
ImageRead = rgb2gray(ImageRead); %灰度化图像
[Count,x]=imhist(ImageRead); %提取直方图
DataBaseFeatures{n,1}=FileName;
DataBaseFeatures{n,2}=Count; %用元胞数组储存特征
DataBaseFeatures{n,3}=DATA(n,1);
end
save('HISTFeatures.mat','DataBaseFeatures'); %保存特征为数据文件
end
实例一: 设计一个图像检索系统,选取图像颜色直方图作为历史特征数据库,根据此特征在历史图像数据库中找出与待检索图像最为相似的几张图像。
第一步:GUIDE画界面。
第二步:编辑代码。
function varargout = jiansuo(varargin)
% JIANSUO MATLAB code for jiansuo.fig
% JIANSUO, by itself, creates a new JIANSUO or raises the existing
% singleton*.
%
% H = JIANSUO returns the handle to a new JIANSUO or the handle to
% the existing singleton*.
%
% JIANSUO('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in JIANSUO.M with the given input arguments.
%
% JIANSUO('Property','Value',...) creates a new JIANSUO or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before jiansuo_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to jiansuo_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help jiansuo
% Last Modified by GUIDE v2.5 15-Aug-2019 18:42:45
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @jiansuo_OpeningFcn, ...
'gui_OutputFcn', @jiansuo_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before jiansuo is made visible.
function jiansuo_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to jiansuo (see VARARGIN)
% Choose default command line output for jiansuo
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes jiansuo wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = jiansuo_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in ChooseImage.
function ChooseImage_Callback(hObject, eventdata, handles)
% hObject handle to ChooseImage (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global k
[filename,PathName] = uigetfile({'*.BMP';'*.bmp';'*.tif';'*.jpg';'*.png'},'选择图像');
str = [PathName filename];
o=str2num(filename(1));
l=str2num(filename(2));
u=str2num(filename(3));
k=o*100+l*10+u;
if PathName ~=0
OrginImage_O = imread(str);
OrginImage = OrginImage_O(:,:,1:3);
axes(handles.axes1);
imshow(OrginImage);
setappdata(handles.ChooseImage,'OrginImage',OrginImage);
end
% --- Executes on button press in jiansuo.
function jiansuo_Callback(hObject, eventdata, handles)
% hObject handle to jiansuo (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global k
if get(handles.btn_zft,'value')
IndexOfPoints=[];
OrginImage=getappdata(handles.ChooseImage,'OrginImage');
load('HISTFeatures.mat');
[m,n]=size(DataBaseFeatures);
OrginImage_Gray = rgb2gray(OrginImage);
[Count1,x] = imhist(OrginImage_Gray) ;
for index = 1:m
Count2 = DataBaseFeatures{index,2};
PathData = DataBaseFeatures{index,1};
ComponentData = DataBaseFeatures{index,3};
Sum1=sum(Count1);Sum2=sum(Count2);
Sumup = sqrt(Count1.*Count2);
SumDown = sqrt(Sum1*Sum2);
Sumup = sum(Sumup);
IndexOfBashi=1-sqrt(1-Sumup/SumDown);%计算图像直方图距离%巴氏系数计算法
IndexOfPoint{index,1}=IndexOfBashi;
IndexOfPoint{index,2}=PathData;
IndexOfPoint{index,3}=ComponentData;
end
IndexOfPoint=sortrows(IndexOfPoint);
axes(handles.axes2);
Serch = imread(IndexOfPoint{m,2});
Serch = Serch(:,:,1:3);
imshow(Serch);
set(handles.text1,'string',IndexOfPoint{m,2});
axes(handles.axes3);
Serch = imread(IndexOfPoint{(m-1),2});
Serch = Serch(:,:,1:3);
imshow(Serch);
set(handles.text2,'string',IndexOfPoint{(m-1),2});
axes(handles.axes4);
Serch = imread(IndexOfPoint{(m-2),2});
Serch = Serch(:,:,1:3);
imshow(Serch);
set(handles.text3,'string',IndexOfPoint{(m-2),2});
axes(handles.axes5);
Serch = imread(IndexOfPoint{(m-3),2});
Serch = Serch(:,:,1:3);
imshow(Serch);
set(handles.text4,'string',IndexOfPoint{(m-3),2});
elseif get(handles.btn_os,'value')
Datadis=[];
OrginImage=getappdata(handles.ChooseImage,'OrginImage');
load('HISTFeatures.mat');
[m,n]=size(DataBaseFeatures);
x=rgb2gray(OrginImage) ; %将图片灰度
h=imhist(x);
for n =1:m
Count = DataBaseFeatures{n,2};
FileName = DataBaseFeatures{n,1};
ComponentData = DataBaseFeatures{n,3};
EulerDistance=sqrt(sum((h-Count).*(h-Count))); %计算欧氏距离
Datadis{n,1}=EulerDistance;
Datadis{n,2}=FileName ;%用元胞数组储存特征
Datadis{n,3}=ComponentData;
end
Datadis=sortrows(Datadis)
axes(handles.axes2);
Serch = imread(Datadis{1,2});
Serch = Serch(:,:,1:3);
imshow(Serch);
set(handles.text1,'string',Datadis{1,2});
axes(handles.axes3);
Serch = imread(Datadis{2,2});
Serch = Serch(:,:,1:3);
imshow(Serch);
set(handles.text2,'string',Datadis{2,2});
axes(handles.axes4);
Serch = imread(Datadis{3,2});
Serch = Serch(:,:,1:3);
imshow(Serch);
set(handles.text3,'string',Datadis{3,2});
axes(handles.axes5);
Serch = imread(Datadis{4,2});
Serch = Serch(:,:,1:3);
imshow(Serch);
set(handles.text4,'string',Datadis{4,2});
end
% --- Executes on button press in exit.
function exit_Callback(hObject, eventdata, handles)
% hObject handle to exit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
clc %清除指令窗
close all %关闭所有句柄可见的窗口
clear %清除内存变量和函数
delete(gcf); %删除(关闭)该窗体
% --- Executes on button press in btn_zft.
function btn_zft_Callback(hObject, eventdata, handles)
% hObject handle to btn_zft (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of btn_zft
set(handles.btn_zft,'value',1);
set(handles.btn_os,'value',0);
% --- Executes on button press in btn_os.
function btn_os_Callback(hObject, eventdata, handles)
% hObject handle to btn_os (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of btn_os
set(handles.btn_os,'value',1);
set(handles.btn_zft,'value',0);
第三步:运行。
第四步:在完成GUI界面创建后,对所创建界面的效果进行试验。点击“读入图像”按钮在文件夹中选择一张待检索图像,接下来选择“直方图距离”或者“欧氏距离”两种检索方法,点击“图像检索”按钮可以经过相似度匹配算法计算之后在下面画布显示出图像数据库中与待检索图像最为相似的几张图像,点击“退出系统”按钮可以退出系统。
- 直方图距离
- 欧氏距离