COVID疫苗卡验证教程系列:第1部分:图像对齐|第2部分:验证检查Image Alignment
教程第2部分:验证检查
对齐后,我们需要检查图像是否真的是一张COVID疫苗接种卡。我们通过验证以下三件事来做到这一点:有足够数量的RANSAC入侵者,标题包含预期的文本,CDC徽标出现在右上角。
检查#1:RANSAC-Inlier的最低要求
在上一节中,我们讨论了如何使用RANSAC来估计用于对齐输入图像的单应性。我们还讨论了在丢弃睡觉(离群值)的同时,某些关键点匹配(内部值)如何支持该估计。验证对齐是否成功的一种方法是要求存在一定数量的内嵌者。这是因为如果图像包含疫苗接种卡,我们可以预期会有更多符合单应单应的关键点匹配。
在我们的测试中,我们发现包含疫苗接种卡的图像往往包含>15个内嵌元素,而不包含疫苗接种卡的图像往往包含<10个内嵌元素。因此,我们执行以下检查:
if RANSAC_inliers < 11:
print("Failed RANSAC inlier verification!")
但是,我们也发现该规则有例外情况,因此我们执行了两个额外的检查。
检查2:验证标题是否正确
作为额外的验证措施,我们通过执行光学字符识别(OCR)来验证卡的标题是否正确。OCR是另一个研究得很好的计算机视觉任务,在这个任务中,文本图像被转换成计算机编码的文本。为此,我们使用了pytesseract,这是一个流行的开源python OCR包。optical character recognition (OCR) pytesseract
首先,我们必须提取对齐图像中包含标题的部分。我们通过引用模板图像来预定义我们期望标题所在的区域来实现这一点。这是通过图像编辑工具(如GIMP)手动获取边界框坐标来实现的。
然后将该图像作为输入提供给pytesseract的image_to_string()方法。我们的read_title()方法的完整代码为:
def read_title(aligned, fileTag=None, debug=False) -> str:
# get title ROI
(x, y, w, h) = (0, 0, 1487, 160)
roi = aligned[y:y + h, x:x + w]
现在我们有了提取的标题,我们可以通过与正则表达式进行比较来检查标题字符串是否包含预期的文本“冠状病毒疫苗记录卡”。我们发现有必要在关键字之间允许可变数量的空格。如果未检测到正确的标题,则测试失败。
expectedTitleRegex = re.compile(r'(COVID\s*-\s*1\s*9\s*Vaccination\s*Record\s*Card)', re.DOTALL)
match = expectedTitleRegex.search(title)
if match is None:
print('Failed title verification!')
检查#3:验证徽标是否存在
作为最后的验证检查,我们检查是否可以在图像右上角检测到CDC和卫生与公众服务部的徽标。我们通过一个称为模板匹配的过程来实现这一点。template matching
同样,我们首先将模板和扫描图像转换为灰度。
aligned_gray = cv2.cvtColor(aligned, cv2.COLOR_BGR2GRAY)
logo_template_gray = cv2.cvtColor(template_img, cv2.COLOR_BGR2GRAY)
接下来,我们使用OpenCV的matchTemplate()方法执行模板匹配。该方法基本上将模板覆盖在图像的一部分上,并计算相似度分数。它通过一次将模板滑过一个像素并重新计算相似性分数,对每个像素重复此过程。该函数返回一个充满相似性分数的二维数组,每个像素对应一个分数。
tm_result = cv2.matchTemplate(aligned_gray, logo_template_gray, cv2.TM_CCOEFF_NORMED)
matchTemplate()方法可以使用许多相似性度量来计算其分数:平方差、互相关或零均值互相关(在统计文献中也称为相关系数)。还提供了每个度量的归一化版本。
对于大多数模板匹配应用程序,零均值归一化互相关(在OpenCV中称为TM_CCOEFF_NORMED)是最合适的。互相关与平方差直接相关,但包含的项较少,因此更容易计算。将图像分布移动到具有零均值使得该测量对图像亮度不敏感。添加规格化可提供对图像对比度的不敏感度,并将输出限制在[-1,1]范围内。如果您有兴趣了解更多关于模板匹配相似性度量的知识,我推荐杜克大学的Carlo Tomasi的课程笔记和CSUR 1992的Lisa Brown的出版物“图像配准技术调查”。course notes from Duke’s Carlo Tomasi Lisa Brown’s publication from CSUR 1992, “A survey of image registration techniques.”
因为我们使用相关系数作为相似性度量,所以输出中的最高值代表最高的相关性(最相似)。我们使用OpenCV的minMaxLoc()方法来获取最大值及其位置。
_, max_zncc_val, _, max_zncc_loc = cv2.minMaxLoc(tm_result)
根据此输出,我们通过检查徽标是否在右上角10个像素以内来验证徽标是否位于预期位置。
if max_zncc_loc[0] < 1470 or max_zncc_loc[1] > 10:
print("Failed CDC logo check. Location should be in top right corner!")
我们还检查最大相关系数是否至少为0.4。我们发现,欺诈性图像往往在(0.15-0.25)范围内产生最大相似度分数,而有效疫苗接种卡的图像产生的最大值>0.5。
elif max_zncc_val < 0.4:
print("Failed CDC logo check. Similarity score too low!")
如果上述两项检查均通过,则表示已成功检测到徽标!
如果所有三个验证检查都通过,则程序表明检测到有效的COVID疫苗接种卡!
COVID疫苗卡验证教程系列:第1部分:图像对齐|第2部分:验证检查Image Alignment
参考文献
[1]:哈特利,理查德,安德鲁·齐瑟曼。计算机视觉中的多视图几何。第二版,剑桥大学出版社,2003年。
[2]:Rublee,Ethan等人。
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/06/29/%e8%87%aa%e5%8a%a8covid%e5%8d%a1%e9%aa%8c%e8%af%81%e2%80%8a-%e2%80%8a%e9%aa%8c%e8%af%81%e6%a3%80%e6%9f%a5/