第16章-基于Hu不变矩的图像检索技术处理算法实现

在这里插入图片描述

深度学习机器学习图像处理

第 16 章 基于Hu不变矩的图像检索技术处理算法实现

不变矩(Invariant Moments)是一处高度浓缩的图像特征,具有平移、灰度、尺度、旋转不变性。M.K.Hu在1961年首先提出了不变矩的概念。1979年M.R.Teague根据正交多项式理论提出了Zernike矩。

函数整理:
% 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

Hu不变矩

“Hu不变矩 Hu 距值具有旋转、缩放、镜像和平移不变性,也就是说相同或相似的形状经过旋转、缩放、平移变换后,其 Hu 矩值不变。对于彩色帐篷形状固定的障碍物,在无人机飞行过程中会产生缩放、平移等变化,但其 Hu 矩值变化不大;而对于火焰由于其面积和轮廓的无规律变化,其 Hu 矩值也会呈相应的无规律变化。Hu 矩是通过二阶和三阶中心矩可求得 7 个不变矩组.
类似于图像的选择缩放仿射变化等空间域处理。
在这里插入图片描述
部分参考:
https://blog.csdn.net/purgle/article/details/50976268
https://www.csdn.net/tags/NtjaYgxsMzQ2My1ibG9n.html

图像预处理图像预处理主要包括图像灰度化、二值化操作,为后续的不变矩计算提供了图像数据。本案例采用MATLAB库函数rbg2gray进行图像灰度化操作, 采用im2bw进行图像二值化操作。
3.2 计算不变矩根据图像不变矩计算公式,可直接将图像视为数据矩阵进行计算。
3.3 图像检索图像不变矩计算完毕后,就需要根据其特征数据进行图像检索。本案例对图像数据库进行特征计算、对比特征值向量、计算相关度来进行检索。
3.4 结果分析图像检索完毕后,对检索结果根据其相关度排序并进行显示。通过实验可以看出,选择Hu不变矩作为特征来进行图像检索具有执行效率高、检索结果有效的特点。对于不同的图像,经过一系列的预处理流程,计算其Hu特征向量,再与原图像库数据进行比较, 提取To pl 0结果图像作为输出, 能在一定程度上反映图像检索的流程,具有一定的使用价值。
前六个不变矩公式如图所示
在这里插入图片描述

最终实现效果如图所示:
在这里插入图片描述

在这里插入图片描述
计算图像的Hu不变矩

function vec = get_hu_vec(im)
% 计算图像的Hu不变矩
if ndims(im) == 3
    im = rgb2gray(im);
end
im = double(im);
m00 = sum(sum(im));
m10 = 0;
m01 = 0;
[row,col] = size(im);
for i = 1:row
    for j = 1:col
        m10 = m10+i*im(i,j);
        m01 = m01+j*im(i,j);
    end
end
u10 = m10/m00;
u01 = m01/m00;
m20 = 0;
m02 = 0;
m11 = 0;
m30 = 0;
m12 = 0;
m21 = 0;
m03 = 0;
for i = 1:row
    for j = 1:col
        m20 = m20+i^2*im(i,j);
        m02 = m02+j^2*im(i,j);
        m11 = m11+i*j*im(i,j);
        m30 = m30+i^3*im(i,j);
        m03 = m03+j^3*im(i,j);
        m12 = m12+i*j^2*im(i,j);
        m21 = m21+i^2*j*im(i,j);
    end
end
y11 = m11-u01*m10;
y20 = m20-u10*m10;
y02 = m02-u01*m01;
y30 = m30-3*u10*m20+2*u10^2*m10;
y12 = m12-2*u01*m11-u10*m02+2*u01^2*m10;
y21 = m21-2*u10*m11-u01*m20+2*u10^2*m01;
y03 = m03-3*u01*m02+2*u01^2*m01;
n20 = y20/m00^2;
n02 = y02/m00^2;
n11 = y11/m00^2;
n30 = y30/m00^2.5;
n03 = y03/m00^2.5;
n12 = y12/m00^2.5;
n21 = y21/m00^2.5;
h1 = n20 + n02;
h2 = (n20-n02)^2 + 4*(n11)^2;
h3 = (n30-3*n12)^2 + (3*n21-n03)^2;
h4 = (n30+n12)^2 + (n21+n03)^2;
h5 = (n30-3*n12)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n21-n03)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);
h6 = (n20-n02)*((n30+n12)^2-(n21+n03)^2)+4*n11*(n30+n12)*(n21+n03);
h7 = (3*n21-n03)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n12-n30)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);
vec = [h1 h2 h3 h4 h5 h6 h7];
% 归一化处理
vec = vec ./ sum(vec);

子函数:

function filePath = OpenImageFile(imgfilePath)
% 打开文件
% 输出参数:
% filePath——文件路径

if nargin < 1
    imgfilePath = fullfile(pwd, 'images/im1.bmp');
end
[filename, pathname, ~] = uigetfile( ...
    { '*.bmp;*.jpg;*.tif;*.png;*.gif','All Image Files';...
    '*.*',  '所有文件 (*.*)'}, ...
    '选择视频文件', ...
    'MultiSelect', 'off', ...
    imgfilePath);
filePath = 0;
if isequal(filename, 0) || isequal(pathname, 0)
    return;
end
filePath = fullfile(pathname, filename);

检索函数:

function ind_dis_sort = SearchResult(vec_hu, vec_color, H)
% 图像检索
vec_hus = cat(1, H.vec_hu);
vec_colors = cat(1, H.vec_color);
% 分别计算Hu、颜色的距离差异
vec_hu = repmat(vec_hu, size(vec_hus, 1), 1);
vec_color = repmat(vec_color, size(vec_colors, 1), 1);
dis_hu = sum((vec_hu-vec_hus).^2, 2);
dis_color = sum((vec_color-vec_colors).^2, 2);
% 按比例加权整合
rate = 0.1;
dis = rate*mat2gray(dis_hu) + (1-rate)*mat2gray(dis_color);
% 排序,将相似的,差异度小的,排在前面
[~, ind_dis_sort] = sort(dis);

颜色特征处理函数

function vec = get_color_vec(im)
% 获取hsv空间矩阵
hsv = rgb2hsv(im);
h = hsv(:,:,1);
s = hsv(:,:,2);
v = hsv(:,:,3);
% 将h变换为角度空间
h = h*360;
H = zeros(size(h));
S = zeros(size(s));
V = zeros(size(v));
% H进行8级量化
H(h<=20 | h>315) = 0;
H(h<=40 & h>20) = 1;
H(h<=75 & h>40) = 2;
H(h<=155 & h>75) = 3;
H(h<=190 & h>155) = 4;
H(h<=271 & h>190) = 5;
H(h<=295 & h>271) = 6;
H(h<=315 & h>295) = 7;
% S进行3级量化
S(s<=0.2 & s>0) = 0;
S(s<=0.7 & s>0.2) = 1;
S(s<=1.0 & s>0.7) = 2;
% V进行3级量化
V(v<=0.2 & v>0) = 0;
V(v<=0.7 & v>0.2) = 1;
V(v<=1.0 & v>0.7) = 2;
% 加权整合,范围[071]
L = 9*H + 3*S + V;
W = zeros(size(L));
% L进行12级量化
W(L<6 & L>=0) = 0;
W(L<12 & L>=6) = 1;
W(L<18 & L>=12) = 2;
W(L<24 & L>=18) = 3;
W(L<30 & L>=24) = 4;
W(L<36 & L>=30) = 5;
W(L<42 & L>=36) = 6;
W(L<48 & L>=42) = 7;
W(L<54 & L>=48) = 8;
W(L<60 & L>=54) = 9;
W(L<66 & L>=60) = 10;
W(L<72 & L>=66) = 11;
vec = zeros(1, 12);
for i = 0 : 11
    % 统计直方图
    Wi = find(W==i);
    vec(i+1) = numel(Wi);
end
% 归一化处理
vec = vec ./ sum(vec);

程序目录树:在这里插入图片描述

案例应用2
在这里插入图片描述

在这里插入图片描述
数据库部分文件截图说明:
在这里插入图片描述
本文使用所有源代码打包下载–>传送门

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海宝7号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值