0

ドキュメントの画像から文字を分離する小さなスクリプトを作成したかったのです。これまでのところ、2 つの文字の画像と、各ピクセルを比較する一連の関数があります。前の文字にピクセルがない場合は文字を作成し、そうでない場合はピクセルを文字に追加します。すでに 1 時間デバッグを試みましたが、何が問題なのかわかりません。ここに私のコードの一部があります:

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)

私が実装しているアルゴリズム: すべての文字が別々であると想定できるため、すべてのピクセルを調べて文字にグループ化できます。ピクセルに、すでに文字グループに含まれている隣接ピクセルがあるかどうかを確認します。答えが「はい」の場合は同じグループに追加し、そうでない場合は別のグループを作成します。最後に、個別のピクセルのグループがあります。

問題は、それらが正しく追加されていないことです。絵に2文字あると、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
4

1 に答える 1

1

少し前に、画像内の接続された形状を見つけるためのアルゴリズムを実装しましたが、興味がなく、当時の私にとっては新しい Python を練習するためのものでした。基本的な考え方は次のとおりです。

  • 画像のすべての行をスキャンします。各行で、プロパティ (色、明るさなど) を共有する連続するピクセルをマークするタプルのリストを生成します。各タプルは のようになり(start x position, end x position, y position)ます。
  • その後、そのようなすべてのタプルを比較し、関連するタプルのグループを形成します。2 つのタプルの y 座標が 1 だけ異なり、x 範囲が重なっている場合、2 つのタプルは同じグループに移動されます。
  • 交差して別のグループにあるタプルが見つからなくなるまで、タプルをグループにマージすることを繰り返します(明らかに、これを見つけた場合は、グループをマージする必要があります)。あなたが見つけたグループは、オブジェクト/文字/何でも/別々の領域です。

これは複雑な戦略ではないと思います。このアルゴリズムは何回も実行されており、ウィキペディアに名前とエントリさえあると確信しています。それが解決する基本的な問題は、異なる行の他のグループ/ピクセル範囲によって接続を検出したときに、一見無関係なピクセル範囲の 2 つのグループが後で 1 つのグループを形成できることです。これの良い例は number2です。最初に、アルゴリズムは各行に 1 つずつ、合計 8 つのグループを検出します。次に、1 つのグループだけが残るまで、中間セクションを使用してグループをマージし、グループを減らしていきます。

于 2012-09-26T17:41:28.413 に答える