【花朵识别】基于matlab模板匹配花朵分类【含Matlab源码 472期】

举报
海神之光 发表于 2022/05/29 03:02:17 2022/05/29
【摘要】 一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【花朵识别】基于matlab模板匹配花朵分类【含Matlab源码 472期】 获取代码方式2: 通过订阅紫极神光博客付费专栏,凭支付凭证,私...

一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【花朵识别】基于matlab模板匹配花朵分类【含Matlab源码 472期】

获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、模板匹配简介

1 概述
模式识别就是通过计算机,用数学模型求解的方法研究模式的自动处理和判读。在模式识别的各种方法中,模板匹配是最容易的一种,其数学模型易于建立,通过模板匹配对数字图像模式识别有助于我们了解数学模型在数字图像中的应用。

2 模板匹配算法
2.1 相似性测度求匹配
模板匹配的实际操作思路很简单:拿已知的模板,和原图像中同样大小的一块区域去对。最开始时,模板的左上角点和图像的左上角点是重合的,拿模板和原图像中同样大小的一块区域去对比,然后平移到下一个像素,仍然进行同样的操作, ……所有的位置都对完后,差别最小的那块就是我们要找的物体。

以上所描述的是相似性测度法求匹配的求解思路,其在计算机中操作的如图2所示。设模板T叠放在搜索图上平移,被模板覆盖搜索图下的那个图像叫做子图Si , j,i , j 为这块子图的左上角像素点在S图的坐标,称为参考点,从图2可知,i , j 的取值范围是:1<i ,j <N- M+1. 现在可以比较T和Si , j的内容。若两者一致,则T和S之差为零. 因此,可用下列公式(1) 和公式(2) 来衡量T和Si , j的相似程度。
在这里插入图片描述
在这里插入图片描述
在(2) 式中第3项表示模板总能量,是一个与(i , j) 无关的常数;第1项是模板覆盖下子图的能量,它随着(i , j) 的位置缓慢地改变;第2项表示的子图与模板的互相关系,随着(i , j) 的改变而改变,当T和Si , j匹配时这项取值最大。因此可用下列相关函数(3) 作相似性测度。
在这里插入图片描述
当矢量t 和S1之间的夹角为0时,即当S1(i , j) =kt 时(k为常量) ,有R(i , j) =1,否则R(i , j) <1. 显然R(i , j) 越大,模板T和Si , j就越相似,点(i , j) 就是我们要寻找的匹配点。

2.2 序贯相似性检测的算法
用相关法求匹配的计算量很大,因为模板要在(N- M+1)2个参考位置上作相关计算,除了在匹配点外,其它点作的都是无用功。因此,人们提出一种叫序贯相似性检测的算法,简称SSDA(Sequential SimiliarityDetectionAlgorithm) 其要点是:
在数字图像中,SSDA法用公式(6) 计算图像f ( x, y) 在点(i , j) 的非相似度m(i , j) 作为匹配尺度。式中(i , j) 表示的不是模板中心坐标,而是它左上角坐标。模板的大小为n ×m。
在这里插入图片描述
如果在(i , j) 处图像中有和模板一致的图案时,则m(i , j) 值很小,反之则很大。特别是模板和搜索图下的子图部分,完全不一致的场合下,如果在模板内的各像素与图像重合部分对应的像素灰度差的绝对值依次增加,其和会急剧增大。 因此,在作加法时,如果灰度差的绝对值部分和超过某一阈值时,就认为这个位置不存在和模板一致的图案,从而转移到下一个位置上计算m(i , j)。并且在这模板下的各像素点计算中止,因此能大幅度地缩短计算时间,提高匹配速度。
根据上述思路,我们可以进一步改进SSDA算法。就是把在图像上的模板移动分为粗检索和细检索2个阶段进行。首先进行粗检索,它不是让模板每次移动1个像素,而是每隔若干的像素把模板和图像重叠,并且计算匹配的尺度,从而求出待寻找的图案大致存在的范围。然后在这个范围内,让模板每隔1个像素移动1次,根据匹配的尺度确定寻找图案的所在位置。这样,整体上计算模板匹配的次数减少了,计算时间缩短,匹配的速度提高了。但用这种方法具有漏掉图像中最恰当位置的危险性。

2.3 相关算法
2个函数的相关性定义,可用公式(7)表示:
在这里插入图片描述
f*表示f 的复共轭。我们知道相关理论类似卷积理论,F( u, v) 和 H( u, v) 分别表示f ( x, y) 和h( x, y)的傅立叶变换. 根据卷积理论有
在这里插入图片描述
可知卷积是空间域过滤和频率域过滤之间的纽带。相关的重要用途在于匹配。在匹配中,f ( x, y) 是一幅包含物体或区域的图像。如果想要确定f 是否包含有感兴趣的物体或区域,让h( x, y) 作为那个物体的区域(通常称该图像为模板)。如果匹配成功,2个函数的相关值会在h找到f 中相应点的位置上达到最大。从上面分析可知,相关算法可以有2种方法:可在空间域进行,也可在频率域进行。

2.4 幅度排序相关算法
这种算法有2个步骤组成:
第1步,把实时图中的各个灰度值按幅度的大小排成列的形式,然后在对它进行二进制(或三进制) 编码,根据二进制排序的序列,把实时图变换为二进制阵列的一个有序的集合{ Cn, n =1,2, …, N}。这一过程称之为幅度排序预处理。
第2步,序贯地将这些二进制序列与基准图进行由粗到细的相关,直到确定出匹配点为止。由于篇幅的限制,这里就不列出例子了。

2.5 分层搜索的序惯判决算法
这种分层搜索算法是直接基于人们先粗后细寻找事物的惯例而形成的,例如,在中国地图上找肇庆的位置时,可以先找广东省这个地域,这过程称为粗相关。然后在这个地域中,再仔细确定肇庆的位置,这叫做细相关。很明显,利用这种方法,可以很快找出肇庆的位置。因为在这过程中省略了寻找广东省以外区域所需的时间,这种方法称为分层搜索的序贯判决法,利用这种思想形成的分层算法具有相当高的搜索速度。限于篇幅,这里只给出这种操作的一般思路。

3 总结
模式匹配本质就是应用数学。模板匹配过程如下:①将图像数字化,按顺序取出每个点的像素值;②代入事先建立的数学模型进行预处理;③选择一种合适的算法进行模式匹配;④将匹配后图像的坐标列出或直接在原图显示.。在模板匹配操作中最为关键的是如何建立数学模型,这是正确匹配的核心。

三、部分源代码

%图一:利用直方图进行图像的匹配
%图二:利用形状进行图像的匹配
%交给你们啦~~~~
%-要求mo<=num
clear;
mo = 1;%-选取第?幅图像
num=5;%图片总数量
distance_const=0.8;%设定直方图距离
similar_const=0.5;%设定形状匹配相似度
close all;
%获取第一幅图像
sname='C:\Users\lenovo\Desktop\62858239matlab1(sxy)\matlab1(sxy)\';%统一修改存储位置,修改路径时只需在此步修改
ss=[sname,num2str(mo),'.jpg'] ; %打开待匹配图像
f1=open_img(ss);                %求待匹配图像的累计直方图
%选择其它待匹配图像
distance=zeros(1,num);
for j=1:num
    sl=[sname,num2str(j),'.jpg']
    f2=open_img(sl);
    %进行直方图的匹配
    d=zeros(1,256);
    for ii=1:256
        d(ii)=(sqrt((f1(ii)-f2(ii)).^2));
    end
    distance(j)=sum(d);
end

distance_num=mo;
for j=1:num
    if distance(j)>0
        if distance(j)<=distance_const
            distance_num=[distance_num,j];
        end
    end
end
%**************************************************************************
%****
disp('采用直方图匹配,在给定的距离值以内的图片名称数为:');
distance_num
disp('采用直方图匹配,在给定的距离值以内的图片数目为:');
length(distance_num)
%**************************************************************************
figure(1)
num = length(distance_num);                              %查找到的累积直方图匹配的图像个数
ref =[sname,num2str(mo),'.jpg'];                         %待检索的图像
ref_img = imread(ref);                                   %打开图像
subplot(num+1,2,1);
imshow(ref_img);
title('待匹配图像')
h1=IMHISTS(ref_img);                                     %对原图像求取直方图
subplot(num+1,2,2);
bar(h1,0.075,'b');
axis([0 255 0 4000]);
title('待匹配图像的直方图');
for i = 1:num
    match = [sname,num2str(distance_num(i)),'.jpg'];     %数据库图像
    match_img = imread(match);                           %打开图像
    subplot(num+1,2,2*i+1);
    imshow(match_img);
    ttxt=sprintf('第%d匹配图像',i);title(ttxt);
    h2=IMHISTS(match_img);                               %对匹配图像求取直方图
    subplot(num+1,2,2*i+2);
    bar(h2,0.075,'b');
    axis([0 255 0 4000]);
    ttxt=sprintf('第%d匹配图像直方图',i);title(ttxt);
end
similar = ones(1,num);
rec_tang_1=center_rectangle(ref_img);
for i = 1:num
    match = [sname,num2str(distance_num(i)),'.jpg'];%数据库图像
    match_img = imread(match);                                   %打开图像
    rec_tang = center_rectangle(match_img);
    for j = 1:6
        similar(i) = similar(i) * (1- abs(rec_tang_1(j)-rec_tang(j)) / (rec_tang_1(j)+rec_tang(j)) );
    end
end
function result=center_rectangle(sdata)
%求取图像的中心矩

size(sdata);
[M,N]=size(sdata);
%***************
%m00,miu00,yibu00分别与公式中数字相互对应,并取其音译
%***************
m00=0.0;
m10=0.0;
m01=0.0;

for i=1:M
    for j=1:N
        m00=m00+double(sdata(i,j));
        m10=m10+i*double(sdata(i,j));
        m01=m01+j*double(sdata(i,j));
    end
end
ave_x=m10/m00;
ave_y=m01/m00;
m00;
miu20=0.0;
miu02=0.0;
miu11=0.0;
miu12=0.0;
miu21=0.0;
miu30=0.0;
miu03=0.0;
%求取7个中心矩
for i=1:M
    for j=1:N
        miu20=miu20+(i-ave_x).^2.*(j-ave_y).^0.*double(sdata(i,j));
        miu02=miu02+(i-ave_x).^0.*(j-ave_y).^2.*double(sdata(i,j));
        miu11=miu11+(i-ave_x).^1.*(j-ave_y).^1.*double(sdata(i,j));
        miu12=miu12+(i-ave_x).^1.*(j-ave_y).^2.*double(sdata(i,j));
        miu21=miu21+(i-ave_x).^2.*(j-ave_y).^1.*double(sdata(i,j));
        miu30=miu30+(i-ave_x).^3.*(j-ave_y).^0.*double(sdata(i,j));
        miu03=miu03+(i-ave_x).^0.*(j-ave_y).^3.*double(sdata(i,j));
    end
end
yibu20=miu20/(m00.^((2+0)/2+1));
yibu02=miu02/(m00.^((0+2)/2+1));
yibu11=miu11/(m00.^((1+1)/2+1));
yibu12=miu12/(m00.^((1+2)/2+1));
yibu21=miu21/(m00.^((2+1)/2+1));
yibu30=miu30/(m00.^((3+0)/2+1));
yibu03=miu03/(m00.^((0+3)/2+1));

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124

四、运行结果

在这里插入图片描述
在这里插入图片描述

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/114545414

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。