一、简介

1 案例背景
视觉通道是人类感知外部世界的主要入口,图像则是多维度信息最直接的表现方式,更有“一图值千金”的谚语。但是,图像往往包含较多的信息量,文本方式很难表达其全面内容,因此对图像信息进行检索很难进行抽象建模。此外,随着互联网信息技术的发展,如何有效地存储、检索海量图像数据也越来越引起人们的关注。因此,通过有效构建图像数据库,搭建图像检索引擎,高效地利用图像的关键数据信息,结合已有的搜索技术来实现海量图像的智能检索系统具有重要的现实意义。目前许多主流的搜索引擎均提供了图像搜索通道,如谷歌相似图搜索、百度识图等。搜索图像时不仅可以根据与图像相关联的文字信息来搜索,而且能够按照图像内容本身来搜索,具有很高的使用价值。
本案例介绍了基于内容的图像检索的基本知识,但主要研究的是基于形状的图像检索技术,通过提取图像特征并进行建库来进行智能检索。本案例选择以图像Hu不变矩特征为标准来进行图像检索,其基本步骤为:首先,对待检索图像利用边缘检测算子进行边缘检测;其次,利用Hu的7个不变矩作为形状特征向量;再次,进行图像的相似度匹配;最后, 在图像库中检索出最相近的Top 10图像序列作为检索结果。实验结果表明, 使用该算法可以有效地检索出相似的图像,具有一定的使用价值。

2 理论基础
随着人们对多媒体信息检索需求的不断增加,传统的基于人工注解的图像检索系统无法实现灵活、高效、准确的图像检索,已远远不能满足人们的需求。为此,研究者们提出了基于内容的图像检索(Content-based Imagine Retrieval, CBIR) , 该方法有效利用了图像自身特征并参考某些模式识别技术来进行高效能图像检索,其基本思路是:将图像的可视特征如颜色特征、纹理结构、边缘轮廓、位置关系等作为图像内容来进行匹配查找,利用已有的模式识别算法进行相似度计算,实现目标检索。其中,图像特征抽取和匹配完全可以借助于数字图像处理技术自动完成,节省了人工成本,提高了执行效率。图像变换在离散数据的条件下往往是不连续的,除平移变换外,旋转和尺度等变换均会导致图像的像素数目变化,从而使计算结果产生误差,而基于不变矩的形状描述可以在一定程度上保存原有的形状信息,具有稳定性,因此可以选择不变矩作为特征进行图像检索。在实际处理过程中,图像的大小可能会影响不变矩特征值,所以在进行图像相似性匹配之前应将图像库中的图像进行尺寸统一化操作,建立标准的图像库。以一幅彩色RGB图像为例, 计算其Hu不变矩特征量的过程为:首先, 将一幅彩色RGB的图像转换为灰度图像,对其进行二值化;然后,归一化二值图像的尺寸,提取边缘图像:最后,统一计算其Hu不变矩。其中,在得到二值边缘图像后,就可以利用不变矩的公式提取不变矩,组成特征向量。在实际处理过程中,考虑到图像库不变矩的计算复杂度较高,因此可以预先执行建库算法,提取其7个Hu不变矩特征,存放于图像的形状特征索引库中,将其提供给图像检索流程来执行图像查询,返回检索结果排序。其中,计算图像Hu不变矩并建库的过程如下所述。
(1)边缘图像
确定边缘提取算子对图像进行边缘提取,得到边缘图像。
(2)提取轮廓
确定边缘图像,并进行轮廓跟踪,得到外轮廓图像。
(3)细化轮廓
确定外轮廓图像,并进行预处理:首先,平滑轮廓得到连续的轮廓线,采用自适应二值化的方法二值化该轮廓线:然后,轮廓线细化操作:最后,提取连续平滑、单像素、二值化的外轮廓图像。
(4)目标区域
确定经过细化的外轮廓图像,并进行种子填充,获取图像的外轮廓线所包围的目标区域作为输入图像。
(5)不变矩计算
确定目标区域图像,并计算目标区域的7个Hu不变矩,将其构造成这幅图像的形状特征向量。
(6)归一化
确定形状特征向量,并对其进行内部归一化处理,将特征值存入图像特征库。

3 程序实现
3.1 图像预处理
图像预处理主要包括图像灰度化、二值化操作,为后续的不变矩计算提供了图像数据。本案例采用MATLAB库函数rbg2gray进行图像灰度化操作, 采用im2bw进行图像二值化操作。

3.2 计算不变矩
根据图像不变矩计算公式,可直接将图像视为数据矩阵进行计算。

3.3 图像检索
图像不变矩计算完毕后,就需要根据其特征数据进行图像检索。本案例对图像数据库进行特征计算、对比特征值向量、计算相关度来进行检索。

3.4 结果分析
图像检索完毕后,对检索结果根据其相关度排序并进行显示。
通过实验可以看出,选择Hu不变矩作为特征来进行图像检索具有执行效率高、检索结果有效的特点。对于不同的图像,经过一系列的预处理流程,计算其Hu特征向量,再与原图像库数据进行比较, 提取To pl 0结果图像作为输出, 能在一定程度上反映图像检索的流程,具有一定的使用价值。

二、部分源代码

function varargout = MainForm(varargin)
% MAINFORM MATLAB code for MainForm.fig
%      MAINFORM, by itself, creates a new MAINFORM or raises the existing
%      singleton*.
%
%      H = MAINFORM returns the handle to a new MAINFORM or the handle to
%      the existing singleton*.
%
%      MAINFORM('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in MAINFORM.M with the given input arguments.
%
%      MAINFORM('Property','Value',...) creates a new MAINFORM or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before MainForm_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to MainForm_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 MainForm% Last Modified by GUIDE v2.5 05-Apr-2021 17:23:30% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @MainForm_OpeningFcn, ...'gui_OutputFcn',  @MainForm_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before MainForm is made visible.
function MainForm_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 MainForm (see VARARGIN)% Choose default command line output for MainForm
handles.output = hObject;
InitAxes(handles);
handles.filePath = 0;
handles.vec_hu = 0;
handles.vec_color = 0;
handles.Img = 0;
handles.ind_dis_sort = 0;
handles.page = 0;
handles.H = 0;
% Update handles structure
guidata(hObject, handles);
% javaFrame = get(hObject, 'JavaFrame');
% javaFrame.setFigureIcon(javax.swing.ImageIcon('MainForm.jpg'));
% UIWAIT makes MainForm wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = MainForm_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 pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if handles.page < 2return;
end
page = handles.page;
ind_dis_sort = handles.ind_dis_sort;
H = handles.H;
page = page - 1;
st = (page-1)*8+1;
et = page*8;
for i = st : etfile = fullfile(pwd, sprintf('%s', H(ind_dis_sort(i)).filename));Img = imread(file);imshow(Img, [], 'parent', eval(sprintf('handles.axes%d', (i-(page-1)*8)+1)));axes(eval(sprintf('handles.axes%d', (i-(page-1)*8)+1)));title(sprintf('%02d', i));
end
handles.ind_dis_sort = ind_dis_sort;
handles.page = page;
guidata(hObject, handles);
set(handles.textpage, 'String', sprintf('第%d页/共2页', page));% --- Executes on button press in pushbutton8.
function pushbutton8_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if handles.page >= 2return;
end
page = handles.page;
ind_dis_sort = handles.ind_dis_sort;
H = handles.H;
page = page + 1;
st = (page-1)*8+1;
et = page*8;
for i = st : etfile = fullfile(pwd, sprintf('%s', H(ind_dis_sort(i)).filename));Img = imread(file);imshow(Img, [], 'parent', eval(sprintf('handles.axes%d', (i-(page-1)*8)+1)));axes(eval(sprintf('handles.axes%d', (i-(page-1)*8)+1)));title(sprintf('%02d', i));
end
handles.ind_dis_sort = ind_dis_sort;
handles.page = page;
guidata(hObject, handles);
set(handles.textpage, 'String', sprintf('第%d页/共2页', page));% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
start_path = fullfile(pwd, 'database');
dialog_title = '选择数据库';
folder_name = uigetdir(start_path,dialog_title);
if isequal(folder_name, 0)return;
end
db_file = fullfile(folder_name, 'H.mat');
if ~exist(db_file, 'file')msgbox('未找到特征数据库,请进行特征提取操作!', '提示信息');return;
end
function InitAxes(handles)
clc;
axes(handles.axes1); cla reset;
axes(handles.axes2); cla reset;
axes(handles.axes3); cla reset;
axes(handles.axes4); cla reset;
axes(handles.axes5); cla reset;
axes(handles.axes6); cla reset;
axes(handles.axes7); cla reset;
axes(handles.axes8); cla reset;
axes(handles.axes9); cla reset;set(handles.axes1, 'XTick', [], 'YTick', [], ...'XTickLabel', '', 'YTickLabel', '', 'Color', [0.7020 0.7804 1.0000], 'Box', 'On');
set(handles.axes2, 'XTick', [], 'YTick', [], ...'XTickLabel', '', 'YTickLabel', '', 'Color', [0.7020 0.7804 1.0000], 'Box', 'On');
set(handles.axes3, 'XTick', [], 'YTick', [], ...'XTickLabel', '', 'YTickLabel', '', 'Color', [0.7020 0.7804 1.0000], 'Box', 'On');
set(handles.axes4, 'XTick', [], 'YTick', [], ...'XTickLabel', '', 'YTickLabel', '', 'Color', [0.7020 0.7804 1.0000], 'Box', 'On');
set(handles.axes5, 'XTick', [], 'YTick', [], ...'XTickLabel', '', 'YTickLabel', '', 'Color', [0.7020 0.7804 1.0000], 'Box', 'On');
set(handles.axes6, 'XTick', [], 'YTick', [], ...'XTickLabel', '', 'YTickLabel', '', 'Color', [0.7020 0.7804 1.0000], 'Box', 'On');
set(handles.axes7, 'XTick', [], 'YTick', [], ...'XTickLabel', '', 'YTickLabel', '', 'Color', [0.7020 0.7804 1.0000], 'Box', 'On');
set(handles.axes8, 'XTick', [], 'YTick', [], ...'XTickLabel', '', 'YTickLabel', '', 'Color', [0.7020 0.7804 1.0000], 'Box', 'On');
set(handles.axes9, 'XTick', [], 'YTick', [], ...'XTickLabel', '', 'YTickLabel', '', 'Color', [0.7020 0.7804 1.0000], 'Box', 'On');

三、运行结果


四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]郝成成,张洁,余萍.基于小波分解和Hu不变矩的图像检索算法[J].东莞理工学院学报. 2018,25(05)

【图像检索】基于matlab GUI Hu不变矩图像检索【含Matlab源码 1508期】相关推荐

  1. 【运动学】基于matlab GUI三体运动模拟【含Matlab源码 871期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[运动学]基于matlab GUI三体运动模拟[含Matlab源码 871期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  2. 【音乐播放】基于matlab GUI动感音乐播放【含Matlab源码 778期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[音乐播放]基于matlab GUI动感音乐播放[含Matlab源码 778期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  3. 【雷达通信】基于matlab GUI相控阵雷达方向图【含Matlab源码 1048期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[雷达通信]基于matlab GUI相控阵雷达方向图[含Matlab源码 1048期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  4. 【数据分析】基于matlab GUI齿轮箱振动数据分析【含Matlab源码 2122期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数据分析]基于matlab GUI齿轮箱振动数据分析[含Matlab源码 2122期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  5. 【光学】基于matlab GUI维达尔之眼计算【含Matlab源码 2545期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI维达尔之眼计算[含Matlab源码 2545期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  6. 【光学】基于matlab GUI双孔干涉【含Matlab源码 2119期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI双孔干涉[含Matlab源码 2119期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费 ...

  7. 【光学】基于matlab GUI双缝干涉和牛顿环【含Matlab源码 2165期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI双缝干涉和牛顿环[含Matlab源码 2165期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  8. 【数字信号】基于matlab GUI电话按键识别【含Matlab源码 2382期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数字信号]基于matlab GUI电话按键识别[含Matlab源码 2382期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  9. Matlab GUI/APP 浅谈(附计算器源码)

    Matlab GUI/APP 浅谈(附计算器源码) 今天没有什么段子,也没有心灵鸡汤.毒鸡汤啥的,纯粹聊一聊这些年从有关MATLAB GUI/APP开发中悟出的一点道理,顺便把计算器的源代码给大家. ...

  10. 【课程设计】基于java GUI实现学生个人信息管理系统(源码+论文+ppt+视频)

    源码资料 免费下载 不经常在线,需要源码和资料的留言私信我,主页有联系方式 技术架构 开发语言 主要用的是Java语言中的GUI(图形用户界面)和AWT(抽象窗口工具包)编程. (1) GUI 图形用 ...

最新文章

  1. java设计一个bank类实现银行_SAP银企直连之平安银行(ECC版)
  2. 「AI 质检员」在富士通上岗,效率比人工高 25%
  3. 方差分析(Analysis of Variance,ANOVA)是什么?方差分析的形式有哪些?
  4. 运行程序报“应用程序配置不正确”或者缺少运行库造成程序不可移植的问题...
  5. php接收一维数组中文乱码解决
  6. Silverlight学习笔记(三):创建第一个Silverlight应用程序
  7. PD生成SQL脚本附带注释命令
  8. *计算机应用基础* 说课稿,中职计算机应用基础《EXCEL中函数的使用》说课稿.doc...
  9. QT:MainWindow初始化列表解释
  10. java树洞_SSM框架开发案例——铁大树洞后台管理系统
  11. raid -- 分区-- 格式化 --挂载
  12. 挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法
  13. 限制UITextView输入字数(兼容iOS7)
  14. Unity 防止数组索引越界的几种方法
  15. 完整安装PX4/PX4-Autopilot,无需科学上网。
  16. 机器学习 泛化误差和偏差-方差
  17. 开源一个电子胸牌项目,很棒!
  18. jacob java excel_使用 Jacob 操作Excel、Word文件
  19. QML:ListView按下选中当前项和高亮的一例
  20. Centos7.6升级到Centos8.0

热门文章

  1. spring-第四篇之让bean获取所在的spring容器
  2. java excel导出(基于注解)
  3. windows MYSQL 安装及修改root密码
  4. 学习Maven之Maven Surefire Plugin(JUnit篇)(转)
  5. [No0000105]java sdk 开发环境变量powershell 自动配置脚本
  6. 去哪儿网2017校招在线笔试(前端工程师)编程题及JavaScript代码
  7. 菜鸟的MySQL学习笔记(二)
  8. Word新建自己的样式
  9. Improving Opencv 4: The Core Functionality :Operations with images
  10. 20190914每日一句