没有正确识别字母

时间:2012-09-26 16:59:32

标签: python image algorithm pixel

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

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)

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

问题是它没有正确添加它们。在图片上有两个字母,它找到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

1 个答案:

答案 0 :(得分:1)

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

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

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