四时宝库

程序员的知识宝库

Mathematica中边缘检测(检测二维码的回字定位点)

要获取定位点,首先得了解二维码的基本信息,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本每边增加4个模块。

177 = 21+(40-1)+4 = 21 +156.


version1:21*21的矩阵

version2: 25*25的矩阵

version3:29*29的矩阵

对应的公式为(V-1)*4+21

  • 尺寸(Version)信息:QrCode共有40种尺寸的矩阵,从21×21(Version 1),到177×177(规格40)
  • 格式信息:表示二维码的纠错级别,分为L、M、Q、H
  • 数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)
  • 定位点、定时标志、校正图形:用于对二维码的定位,确定二维码的内容区域

假设我们要分析的二维码图是下面的这个

首先进行轮廓检测

我们可以根据凸包属性找到凸包中包含的元素数目,这个前提需要知道凸包包含的元素数目

ComponentMeasurements[ j, "MaskedImage", 600 >= #ConvexCount >= 500 &]

是不是马上找到了,但是需要知道凸包里面元素数量,再一个我们可以通过找“回”

ComponentMeasurements[ j, "MaskedImage", #Holes == 1 &]

找到回字的矩形位置:

cells = ComponentMeasurements[j, {"BoundingBox"}, #Holes == 1 &]
{4 -> {{{112., 113.}, {136., 137.}}},6 -> {{{13., 110.}, {38., 134.}}}, 7 -> {{{0., 107.}, {9., 132.}}},23 -> {{{17., 11.}, {41., 36.}}}}

画出来

HighlightImage[j, 
 Map[Rectangle[#[[1]][[1]], #[[1]][[2]]] &, cells[[All, 2]]]]

那排除那个明显不是正方形的,也很简单

HighlightImage[j, 
 Map[Rectangle[#[[1]][[1]], #[[1]][[2]]] &, 
  Normal[Select[Association[cells], 
     0.9 <= Subtract[#[[1]][[1]], #[[1]][[2]]][[1]]/
       Subtract[#[[1]][[1]], #[[1]][[2]]][[2]]  <= 1.1 &]][[All, 2]]]]

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接