我正在尝试使用模板图像检测数独网格中的数字。我在MATLAB中这样做。 例如,我已经裁剪过' 1'图像,我需要使用此图像,以便检测其他' 1'出现在图像中。我不会去任何地方。请帮我。何
答案 0 :(得分:3)
您选择了最难开头的数字,因为如果您使用典型的模板匹配方法(使用xcorr2
,normxcorr2
或conv2
),那么您将继续意外地与水平和垂直线以及4的直立部分很好地匹配。
为了更好地演示基本过程,我将从数字7开始,因为它有点形状的独特性。
首先,我们要将图像加载为灰度(仅提取红色通道)
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);
正如您所看到的,当模板匹配良好(7')时,相关值很高(白色),而在不匹配的情况下,相关值很高。
正如您可以很容易地看到,在得到的相关矩阵中存在三个主要峰值(知道有多少7' s有点困难)。
关联性的好处是值实际上意味着某事。所以我们可以为#34;好"设置一个截止点。为了举个例子,让我们以0.7作为我们的截止值;
[row, col] = find(C >= 0.7);
hold on
plot(col, row, 'y.');
实际上有35个点C
大于0.7;但是,它们显然分为三组。
您可以通过各种方式对这些进行聚类。然后取每组的平均中心。
现在处理1&#39>
的更难的问题如果我们看一下与一幅图像的归一化互相关的结果,我们会得到这样的结果。
正如你所看到的,你拿起那些,但你也拿起所有垂直线。值得庆幸的是,我们可以使用垂直白线和2D卷积轻松地检测到这些
vline = ones(size(board,1), 1);
lineimage = conv2(board, vline, 'same');
然后,您可以使用lineimage
作为相关值的加权,这样您就只能返回" true"峰。
% Normalize
lineimage = lineimage ./ max(lineimage(:));
C = C .* lineimage;
我们现在可以看到真正的更好。
然后我们可以使用与以前类似的方法绘制一些点(注意较低的截止相关值)。
[row, col] = find(C >= 0.4)
p = plot(col, row, 'y.')
正如你所看到的那样,我们选择了4,但值得一试。
虽然这是一个很棒的练习,但您也可以轻松使用MATLAB的内置ocr功能
答案 1 :(得分:1)
我建议您首先将图像分割成9 x 9(81)个较小的图像,然后分别处理每个较小的图像。
我刚刚完成了在线机器学习课程(https://www.coursera.org/learn/machine-learning),并且识别手写数字是每周作业之一。使用神经网络,使用学习数据和提供的编程模板,这项任务相当容易。本课程的新课程将于2月8日星期一开始。没有任何费用。你会学到很多东西。我强烈推荐它。 (与我分享我的作业对我来说是违反荣誉准则的行为。)