模式识别基于模板匹配的手写体数字识别matlab源码
Posted 博主QQ2449341593
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模式识别基于模板匹配的手写体数字识别matlab源码相关的知识,希望对你有一定的参考价值。
一、简介
一、模板匹配概念
-
定义:
模板匹配是在一副图像中寻找到与给定目标模板图像的技术。
在匹配过程中有两个主要因素:原始图像I,模板图像T。
为了在原始图像I上检测到与模板图像T最匹配的区域,需要在原始图像I上滑动模板窗口,每次需要将模板图像T在原始图像I上滑动一个像素大小(从左至右,从上至下),每次移动后计算出其相似度来表征匹配结果的好与坏。
将每个位置的匹配结果存储在R矩阵中,该矩阵的每一个点的亮度表示与模板图像T的匹配程度。
通过minMaxLoc函数找到R矩阵中的最大值、最小值。
-
匹配方法:
常见的相似度匹配方法:
a)method=CV_TM_SQDIFF,平方差匹配法
b)method=CV_TM_SQDIFF_NORMED,归一化平方差匹配法
c)method=CV_TM_CCORR,相关匹配法
d)method=CV_TM_CCORR_NORMED,归一化相关匹配法
e)method=CV_TM_CCOEFF,系数匹配法
f)method=CV_TM_CCOEFF_NOR,归一化相关系数匹配法
-
相似性匹配结果矩阵R的大小:
模板图像在原始图像上移动一个像素,并将计算出来的相似度数据存储在R矩阵中,那么在整个原始图像上每行横向移动只需移动raw_img.cols-mask_img_cols+1次;每列纵向移动只需移动raw_img.cols-mask_img.cols+1次;
-
OpenCV模板匹配函数:matchTemplate()
格式:void matchTemplate(inputArray image,inputArray templ,outputArray result,int method)
功能:用于匹配出和模板重叠的图像区域
参数:
inputArray image,待搜索的图像,且需为8位或32位浮点型图像;
inputArray templ,搜索模板,需和源图像有一样的数据类型,且尺寸不能大于源图像。
outputArray result,比较结果的映射图像,其必须为单通道、32位浮点型图像,如果图像尺寸是W*H,而templ的尺寸是w*h,则此参数result一定是(W-w+1)x(H-h+1) ;
int method,指定的匹配方法;
常见的匹配方法:
(1)平方差匹配法 method=TM_SQDIFF
(2)归一化平方差匹配法 method=TM_SQDIFF_NORMED
(3)相关匹配法 method=TM_CCORR
(4)归一化相关匹配法 method=TM_CCORR_NORMED
(5)系数匹配法 method=TM_CCOEFF
(6)归一化相关系数匹配法 method=TM_CCOEFF_NORMED
【注】:模板匹配的方法适用于模板很小,而原图像很大的情况下,不然得到的图像会很小,而且只是原图像左上的一部分,如果要检测的物体在右下角,可能在目标图中框不完全要检测的物体。
二、源代码
clc; clear all; close all;
load Data.mat;
[FileName,PathName,FilterIndex] = uigetfile({'*.jpg;*.tif;*.png;*.gif', ...
'所有图像文件';...
'*.*','所有文件' },'载入数字图像',...
'.\\\\images\\\\手写数字\\\\t0.jpg');
if isequal(FileName, 0) || isequal(PathName, 0)
return;
end
fileName = fullfile(PathName, FileName);
I = imread(fileName);
flag = 1;
I1 = Normalize_Img(I);
bw1 = Bw_Img(I1);
bw2 = Thin_Img(bw1);
bw = bw2;
sz = size(bw);
[r, c] = find(bw==1);
rect = [min(c) min(r) max(c)-min(c) max(r)-min(r)];
vs = rect(1)+rect(3)*[5/12 1/2 7/12];
hs = rect(2)+rect(4)*[1/3 1/2 2/3];
pt1 = [rect(1:2); rect(1:2)+rect(3:4)];
pt2 = [rect(1)+rect(3) rect(2); rect(1) rect(2)+rect(4)];
k1 = (pt1(1,2)-pt1(2,2)) / (pt1(1,1)-pt1(2,1));
x1 = 1:sz(2);
y1 = k1*(x1-pt1(1,1)) + pt1(1,2);
k2 = (pt2(1,2)-pt2(2,2)) / (pt2(1,1)-pt2(2,1));
x2 = 1:sz(2);
y2 = k2*(x2-pt2(1,1)) + pt2(1,2);
if flag
figure('Name', '数字识别', 'NumberTitle', 'Off', 'Units', 'Normalized', 'Position', [0.2 0.45 0.5 0.3]);
subplot(2, 2, 1); imshow(I, []); title('原图像', 'FontWeight', 'Bold');
subplot(2, 2, 2); imshow(I1, []); title('归一化图像', 'FontWeight', 'Bold');
hold on;
h = rectangle('Position', [rect(1:2)-1 rect(3:4)+2], 'EdgeColor', 'r', 'LineWidth', 2);
xlabel('数字区域标记');
subplot(2, 2, 3); imshow(bw1, []); title('二值化图像', 'FontWeight', 'Bold');
subplot(2, 2, 4); imshow(bw, [], 'Border', 'Loose'); title('细化图像', 'FontWeight', 'Bold');
hold on;
h = [];
for i = 1 : length(hs)
h = [h plot([1 sz(2)], [hs(i) hs(i)], 'r-')];
end
for i = 1 : length(vs)
h = [h plot([vs(i) vs(i)], [1 sz(1)], 'g-')];
end
h = [h plot(x1, y1, 'y-')];
h = [h plot(x2, y2, 'm-')];
legend([h(1) h(4) h(7) h(8)], {'水平线', '竖直线', '左对角线', '右对角线'}, 'Location', 'BestOutside');
hold off;
end
function num = Main_Process(I, flag)
if nargin < 2
flag = 1;
end
I1 = Normalize_Img(I);
bw1 = Bw_Img(I1);
bw2 = Thin_Img(bw1);
bw = bw2;
sz = size(bw);
[r, c] = find(bw==1);
rect = [min(c) min(r) max(c)-min(c) max(r)-min(r)];
vs = rect(1)+rect(3)*[5/12 1/2 7/12];
hs = rect(2)+rect(4)*[1/3 1/2 2/3];
pt1 = [rect(1:2); rect(1:2)+rect(3:4)];
pt2 = [rect(1)+rect(3) rect(2); rect(1) rect(2)+rect(4)];
k1 = (pt1(1,2)-pt1(2,2)) / (pt1(1,1)-pt1(2,1));
x1 = 1:sz(2);
y1 = k1*(x1-pt1(1,1)) + pt1(1,2);
k2 = (pt2(1,2)-pt2(2,2)) / (pt2(1,1)-pt2(2,1));
x2 = 1:sz(2);
y2 = k2*(x2-pt2(1,1)) + pt2(1,2);
if flag
figure('Name', '数字识别', 'NumberTitle', 'Off', 'Units', 'Normalized', 'Position', [0.2 0.45 0.5 0.3]);
subplot(2, 2, 1); imshow(I, []); title('原图像', 'FontWeight', 'Bold');
subplot(2, 2, 2); imshow(I1, []); title('归一化图像', 'FontWeight', 'Bold');
hold on;
h = rectangle('Position', [rect(1:2)-1 rect(3:4)+2], 'EdgeColor', 'r', 'LineWidth', 2);
legend(h, '数字区域标记', 'Location', 'BestOutside');
'FontWeight', 'Bold');
hold on;
h = [];
for i = 1 : length(hs)
h = [h plot([1 sz(2)], [hs(i) hs(i)], 'r-')];
end
for i = 1 : length(vs)
h = [h plot([vs(i) vs(i)], [1 sz(1)], 'g-')];
end
h = [h plot(x1, y1, 'y-')];
h = [h plot(x2, y2, 'm-')];
legend([h(1) h(4) h(7) h(8)], {'水平线', '竖直线', '左对角线', '右对角线'}, 'Location', 'BestOutside');
hold off;
end
v{1} = [1:sz(2); repmat(hs(1), 1, sz(2))]';
v{2} = [1:sz(2); repmat(hs(2), 1, sz(2))]';
v{3} = [1:sz(2); repmat(hs(3), 1, sz(2))]';
v{4} = [repmat(vs(1), 1, sz(1)); 1:sz(1)]';
v{5} = [repmat(vs(2), 1, sz(1)); 1:sz(1)]';
v{6} = [repmat(vs(3), 1, sz(1)); 1:sz(1)]';
v{7} = [x1; y1]';
v{8} = [x2; y2]';
三、运行结果
完整代码咨询QQ1575304183
以上是关于模式识别基于模板匹配的手写体数字识别matlab源码的主要内容,如果未能解决你的问题,请参考以下文章
手写数字识别基于matlab GUI欧拉数和二维矩阵相关系数手写数字识别含Matlab源码 1896期
字符识别基于matlab模板匹配(区域生长法)字母+数字识别含Matlab源码 1214期