创建匹配模板以在Matlab中检测图像

时间:2016-02-05 21:45:34

标签: image matlab image-processing

我正在尝试使用模板图像检测数独网格中的数字。我在MATLAB中这样做。 Scanned image     例如,我已经裁剪过' 1'图像,我需要使用此图像,以便检测其他' 1'出现在图像中。我不会去任何地方。请帮我。何

2 个答案:

答案 0 :(得分:3)

您选择了最难开头的数字,因为如果您使用典型的模板匹配方法(使用xcorr2normxcorr2conv2),那么您将继续意外地与水平和垂直线以及4的直立部分很好地匹配。

为了更好地演示基本过程,我将从数字7开始,因为它有点形状的独特性。

enter image description here

首先,我们要将图像加载为灰度(仅提取红色通道)

board = imread('board.jpg')
board = board(:,:,1);

template = imread('seven.jpg')
template = template(:,:,1)

为了检测图像中的模板,我们可以使用normalized 2D cross-correlation。这种方法基本上将模板移到图像上,并在每次移动时计算模板和图像之间的相关性。

C = normxcorr2(template, board);
figure; imshow(C);

enter image description here

正如您所看到的,当模板匹配良好(7')时,相关值很高(白色),而在不匹配的情况下,相关值很高。

正如您可以很容易地看到,在得到的相关矩阵中存在三个主要峰值(知道有多少7' s有点困难)。

关联性的好处是值实际上意味着某事。所以我们可以为#34;好"设置一个截止点。为了举个例子,让我们以0.7作为我们的截止值;

[row, col] = find(C >= 0.7);

hold on
plot(col, row, 'y.');

enter image description here

实际上有35个点C大于0.7;但是,它们显然分为三组。

您可以通过各种方式对这些进行聚类。然后取每组的平均中心。

现在处理1&#39>

的更难的问题

如果我们看一下与一幅图像的归一化互相关的结果,我们会得到这样的结果。

enter image description here

正如你所看到的,你拿起那些,但你也拿起所有垂直线。值得庆幸的是,我们可以使用垂直白线和2D卷积轻松地检测到这些

vline = ones(size(board,1), 1);
lineimage = conv2(board, vline, 'same');

enter image description here

然后,您可以使用lineimage作为相关值的加权,这样您就只能返回" true"峰。

% Normalize
lineimage = lineimage ./ max(lineimage(:));
C = C .* lineimage;

我们现在可以看到真正的更好。

enter image description here

然后我们可以使用与以前类似的方法绘制一些点(注意较低的截止相关值)。

[row, col] = find(C >= 0.4)
p = plot(col, row, 'y.')

enter image description here

正如你所看到的那样,我们选择了4,但值得一试。

虽然这是一个很棒的练习,但您也可以轻松使用MATLAB的内置ocr功能

答案 1 :(得分:1)

我建议您首先将图像分割成9 x 9(81)个较小的图像,然后分别处理每个较小的图像。

我刚刚完成了在线机器学习课程(https://www.coursera.org/learn/machine-learning),并且识别手写数字是每周作业之一。使用神经网络,使用学习数据和提供的编程模板,这项任务相当容易。本课程的新课程将于2月8日星期一开始。没有任何费用。你会学到很多东西。我强烈推荐它。 (与我分享我的作业对我来说是违反荣誉准则的行为。)