【问题标题】:Not recognizing letters properly [closed]无法正确识别字母[关闭]
【发布时间】:2012-09-18 09:01:44
【问题描述】:

我想创建一个小脚本,它将字母与文档图像分开。到目前为止,我有一张两个字母的图片,以及一组比较每个像素的函数,如果前面的字母中没有像素,则创建一个字母,否则将像素添加到字母中。我已经尝试调试了一个小时,但不知道可能出了什么问题。这是我的代码的一部分:

def findChars():
    im = Image.open("img-190.gif")
    letters = []
    for x in range(im.size[0]):
        for y in range(im.size[1]):
            px = im.getpixel((x,y))
            if(px == 0):#black
                found = False
                for letter in letters:
                    for pixel in letter.pix:
                        if(isNextTo((x,y),pixel) == True):
                            found = True
                            letter.pix +=((x,y),)
                            #print len(letter.pix)
                            break
                if(found == False):
                    letters.append(Letter((x,y)))
                    print "Appended"

    print len(letters)

我正在实施的算法: 因为我可以假设所有字母都是分开的,所以我可以遍历所有像素并将它们分组为字母。我检查一个像素是否有任何已经在一个字母组中的邻居。如果答案是肯定的,我将它添加到同一个组,如果不是,我创建另一个。最后,我有一组独立的像素。

问题是它没有正确添加它们。图片上有两个字母,找到49组(字母)。

这是我的另一个函数代码:

def isNextTo(spix,qpix):
    DIST = 1
    if(qpix[0]< spix[0]-DIST or qpix[0]> spix[0]+DIST):
        return False
    if(qpix[1]< spix[1]-DIST or qpix[1]> spix[1]+DIST):
        return False
    return True

【问题讨论】:

  • 您到底想做什么(大局观)?类似于 OCR 的东西?您所描述的问题(模式识别、计算机视觉)似乎是一个非常困难的问题,并且很可能最好通过现有的 3rd 方库来解决。
  • 不,因为从您的问题中不清楚您要实现什么算法。问题仍然存在,为什么要将像素分组为字母?达到什么目的?正如我所说,这是一个非常困难的问题,你不可能自己解决。
  • 但是您正在浏览像素扫描列;为什么你会认为你已经知道你正在检查的像素旁边的像素?查看字母 Z 或 S;注意到第一列中的像素了吗?
  • @coolbartek 您不会编写执行 OCR 的简单脚本。说真的,这仍然是一个活跃的工业研究领域。买一本关于这个主题的书,读一读,然后回来。
  • @coolbartek 不,这还不错,没有人在评判你。只是您选择了一个非常困难的问题领域,拥有数百万美元预算的大学和公司仍在努力解决。像机器人技术、语音识别、机器翻译……这就是为什么它不太适合学习 Python:问题本身就是太难了。

标签: python image algorithm pixel


【解决方案1】:

前段时间,我实现了一种算法,用于在图像中查找连接的形状,更多的是出于兴趣和练习 Python,这在当时对我来说是新事物。基本思想是这样的:

  • 扫描图像的所有行。在每一行中,生成一个元组列表,这些元组标记共享属性(颜色、亮度等)的连续像素。每个元组看起来像(start x position, end x position, y position)
  • 之后,比较所有这样的元组并形成相关元组的组。如果两个元组的 y 坐标相差 1 并且它们的 x 范围重叠,则将它们移动到同一个组。
  • 重复将元组合并到组中,直到找不到相交且位于不同组中的元组(显然,如果你发现了这种情况,就必须合并组)。您找到的组是您的对象/字母/任何/单独的区域。

我不认为这是一个复杂的策略,而且我确信这个算法已经完成了无数次,甚至可能在 Wikipedia 上有一个名称和条目。它解决的基本问题是,当您通过不同行中的其他组/像素范围检测到连接时,两组看似无关的像素范围可以形成一个组。一个很好的例子是号码2。起初,该算法可以检测 8 个组,每行一个。然后它会通过中间部分将这些组合并成越来越少的组,直到只剩下一个组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多