2016-03-28 13 views
1

私は現在、画像処理アルゴリズムのためにPython内部でFelzenszwalbとHuttenlocher(http://www.cs.cornell.edu/~dph/papers/dt.pdf)によって記述されたGDTを実装しようとしています。しかし、私は2,3年前に出版した論文に記載されているアルゴリズムを使用しましたが、結果は不良でした。私はここにC#の実装を見つけました:https://dsp.stackexchange.com/questions/227/fastest-available-algorithm-for-distance-transform/29727?noredirect=1#comment55866_29727Pythonで一般化された距離変換

そしてそれをPythonに変換しました(これは私が以前と同じでした)。

これは私のコードです:

def of_column(dataInput): 
    output = zeros(dataInput.shape) 
    n = len(dataInput) 

    k = 0 
    v = zeros((n,)) 
    z = zeros((n + 1,)) 

    v[0] = 0 
    z[0] = -inf 
    z[1] = +inf 

    s = 0 

    for q in range(1, n): 
     while True: 
      s = (((dataInput[q] + q * q) - (dataInput[v[k]] + v[k] * v[k]))/(2.0 * q - 2.0 * v[k])) 

      if s <= z[k]: 
       k -= 1 
      else: 
       break 

     k += 1 

     v[k] = q 
     z[k] = s 
     z[k + 1] = +inf 

    k = 0 

    for q in range(n): 
     while z[k + 1] < q: 
      k += 1 

     output[q] = ((q - v[k]) * (q - v[k]) + dataInput[v[k]]) 

    return output 

私はまだ私のエラーを見つけることができません。アルゴリズムにバイナリ(ブーリアン)のnumpy配列を渡すと、距離変換ではなく配列自体が返されます。なぜこれがPythonで動作しないのですか?

+0

私はそれを数時間と数時間後に働かせました。 C#でコードを実装する上のリンクで与えられた答えは、「白い」領域を非常に大きな数にすることを示唆しています。私のdataInput配列はブール値の配列(0、1)でした。私はすべての1を2^32に置き換えました。うまく動作します。数字が高いほど、ぼやけてしまいます。低いほど、それが得られるソースに似ています。 – macskay

+0

自己回答と自分の答えを受け入れることは、この問題がより完全に解決されていることを示しています。 –

+0

あなたの回答でもあなたはアップフォートを得ることができます:) –

答えて

1

私はそれを数時間と数時間後に稼働させました。 C#でコードを実装する上のリンクで与えられた答えは、「白い」領域を非常に大きな数にすることを示唆しています。私のdataInput配列はブール値の配列(0、1)でした。私はすべての1を2^32に置き換えました。うまく動作します。数字が高いほど、ぼやけてしまいます。低いほど、それが得られるソースに似ています。

0

私は前述の1D機能と連携した2Dのための機能を追加したい:

############################################################################### 
# distance transform of 1d function using squared distance 
############################################################################### 
def dt_1d(dataInput, n): 
    output = np.zeros(dataInput.shape) 
    k = 0 
    v = np.zeros((n,)) 
    z = np.zeros((n + 1,)) 
    v[0] = 0 
    z[0] = -np.inf 
    z[1] = +np.inf 
    for q in range(1, n): 
     s = (((dataInput[q] + q * q) - (dataInput[v[k]] + v[k] * v[k]))/(2.0 * q - 2.0 * v[k])) 
     while s <= z[k]: 
      k -= 1 
      s = (((dataInput[q] + q * q) - (dataInput[v[k]] + v[k] * v[k]))/(2.0 * q - 2.0 * v[k])) 
     k += 1 
     v[k] = q 
     z[k] = s 
     z[k + 1] = +np.inf 

    k = 0 
    for q in range(n): 
     while z[k + 1] < q: 
      k += 1 
     value = ((q - v[k]) * (q - v[k]) + dataInput[v[k]]) 
     if value > 255: value = 255 
     if value < 0: value = 0 
     output[q] = value 
    print output 
    return output 
############################################################################### 
# distance transform of 2d function using squared distance 
###############################################################################  
def dt_2d(dataInput): 
    height, width = dataInput.shape 
    f = np.zeros(max(height, width)) 
    # transform along columns 
    for x in range(width): 
     f = dataInput[:,x] 
     dataInput[:,x] = dt_1d(f, height) 
    # transform along rows 
    for y in range(height): 
     f = dataInput[y,:] 
     dataInput[y,:] = dt_1d(f, width) 
    return dataInput 

私はそれが役に立てば幸い。