最简单的方法是通过二维归一化互相关进行模板匹配。
这基本上是在寻找一个模板:一个代表回复字母的小图像,在一个(通常更大的)图像内。此操作返回的结果看起来像一个图像,但它本质上具有模板与图像匹配的峰值。
这种转移到这个问题的方法意味着必须对每个可能的答案进行一个互相关,并对每个结果图像进行“峰值”检查。
当然,这假设字母在整个文档中以单一比例出现。否则,也必须在不同的尺度上应用互相关(通过适当的方法)。
这里有两个组件需要仔细管理:
图像的质量和比例:
这可以通过指示用户将相机视野的左上角与纸张对齐来粗略控制。这将限制与图像的距离,但仍取决于手机的镜头。
模板的质量和规模:
这取决于#1 和用户的手写。但平均而言,可以使用大致相同大小的字体(如下所述)。
这是一个基于Python、matplotlib和scikit-image的示例:
from matplotlib import imshow, show
from skimage.io import imread
from skimage.feature import match_template
#Load the image
Q = imread("tst4.jpg")
#Load the template, here it is the letter A from the Sans font, approximately at the same size as the hand-written provided
A = imread("letter2.png")
U = match_template(Q, A, pad_input = True)
#Show the result
imshow(U);show()
(请注意,可通过此链接获得更详细的版本)
结果U如下所示:

对于一个Q看起来像这样的:

A看起来像这样:

在U图像中,请注意红色对应于高峰值(非常接近 1.0)。只需在 的像素值上设置一个阈值,U就会返回“A”符号的中心。
当然,该图像中的其他形态似乎也具有很高的相关性。这些是“误报”,即算法认为存在“A”但实际上没有的地方。
有两种方法可以减少这些(并提高系统的可靠性):
在较小的区域上应用模板匹配(如果左上角与纸张边缘大致对齐,现在可以这样做)
为分类操作添加更多的特征,而不仅仅是模板和图像之间的互相关峰值,以使其更加健壮。这可能是复杂性的下一个级别,如果需要,可以提供更多信息。
希望这可以帮助。