2012-04-02 8 views
1

私は輪郭線を持つ2値画像を持っており、すべての不要な画素の各輪郭線を浄化する必要があり、最小限に接続された線が残ります。2進イメージの輪郭線を細くする

誰かがこの種の問題のソース、コード例、またはその他の情報を教えてくれますか?ヘルプを検索する場所はどこですか?

+0

Google検索で「graphics algorithm thinning lines」を検索し、かなりヒットしました。これを試しましたか? –

答えて

2

Pythonの実装をお探しの場合は、scikit-imageをご覧ください。

One of their examplesは、本質的にあなたの使用例です。

また、「まっすぐ」scipyに固執する場合は、連続してerosions and dilations using scipy.ndimageを使用してこれを行うことができます。 (As @AxezDNydeと同様に)

編集:リンクが固定されています。

1

バイナリイメージのエロージョンと膨張(およびその逆)の組み合わせは、小さな線をそのまま残してノイズのような塩nコショウを取り除くのに役立ちます。キーワードは「順位フィルタ」と「形態フィルタ」です。

2

実際にZhang-Suen間引きアルゴリズムと呼ばれるアルゴリズムがあります。 http://rosettacode.org/wiki/Zhang-Suen_thinning_algorithm

また、私はそのコードより約10倍速いPythonでベクトル化されたバージョンを書いています。

def neighbours_vec(image): 
    return image[2:,1:-1], image[2:,2:], image[1:-1,2:], image[:-2,2:], image[:-2,1:-1],  image[:-2,:-2], image[1:-1,:-2], image[2:,:-2] 

def transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9): 
    return ((P3-P2) > 0).astype(int) + ((P4-P3) > 0).astype(int) + \ 
    ((P5-P4) > 0).astype(int) + ((P6-P5) > 0).astype(int) + \ 
    ((P7-P6) > 0).astype(int) + ((P8-P7) > 0).astype(int) + \ 
    ((P9-P8) > 0).astype(int) + ((P2-P9) > 0).astype(int) 

def zhangSuen_vec(image, iterations): 
    for iter in range (1, iterations): 
     print iter 
     # step 1  
     P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image) 
     condition0 = image[1:-1,1:-1] 
     condition4 = P4*P6*P8 
     condition3 = P2*P4*P6 
     condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1 
     condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6) 
     cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1) 
     changing1 = numpy.where(cond == 1) 
     image[changing1[0]+1,changing1[1]+1] = 0 
     # step 2 
     P2,P3,P4,P5,P6,P7,P8,P9 = neighbours_vec(image) 
     condition0 = image[1:-1,1:-1] 
     condition4 = P2*P6*P8 
     condition3 = P2*P4*P8 
     condition2 = transitions_vec(P2, P3, P4, P5, P6, P7, P8, P9) == 1 
     condition1 = (2 <= P2+P3+P4+P5+P6+P7+P8+P9) * (P2+P3+P4+P5+P6+P7+P8+P9 <= 6) 
     cond = (condition0 == 1) * (condition4 == 0) * (condition3 == 0) * (condition2 == 1) * (condition1 == 1) 
     changing2 = numpy.where(cond == 1) 
     image[changing2[0]+1,changing2[1]+1] = 0 
    return image 
0

あなただけのインストールピップできthinningと呼ばれるは、PyPIで利用可能なパッケージがあります:ここではコードです。これは、不規則な配列/ opencvグレースケール画像のGuoとHallによる間引きアルゴリズムを実装しています。