2017-08-25 3 views
1

opencvを使用して次の問題を解決しようとしています。入力として、各ピクセルが0から10の間の値に設定された2つのpngファイルがあります。11値のそれぞれについて、2つの入力ファイルの間に重複するピクセル数を確認したいと思います。たとえば、img1.pngにはピクセル(0,0)〜(0,26)の値が3に設定されています。img2.pngにはピクセル(0,2)〜(0,30)と(1,0)〜 (1,5)は3に設定されているので、img1は27ピクセルが3に設定されています。img2は35ピクセルが3に設定されています。これらのうち、25のオーバーラップピクセル、つまり(0,2)〜 0,26)。2つの画像間の重複ラベルの数 - Python/NumPy

私が欲しいのは、この情報をすばやく抽出する方法です。0〜10の値でいくつのピクセルが重なっていますか?各イメージのピクセル数は0〜10です。この情報を使って、私はそれぞれの価値についてある種の重なりスコアを定式化したいと思う。

私は素朴なことを知っていますが、私は各画像でピクセルごとに見ることができ、アキュムレータを使ってこの情報を数えます。しかし、これは非常に遅くなるようですが、opencvでは画像のインデックス付けを細かく行うことができるので、おそらくこれらの計算をスピードアップする方法があることはわかっています。しかし、私はopencvやnumpyに精通しておらず、これについてどうやって行くのかについてはあまりよく分かりません。現在、参照として本を見て

http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html

答えて

2

アプローチ#1:最初のアプローチは、次の手順伴うだろう:

  • は、2つのアレイ間の平等のマスクを取得する(画像アレイ) 。

  • 配列の1つとラベルの範囲の等しいマスクを取得します。

  • 最後に、前の2つのステップで得られた2つの配列間のテンソル合計を取得し、すべてのラベルの数を返します。

したがって、我々は、テンソルの和削減のためNumPy broadcastingnp.einsumを-using 1つのベクトル化ソリューションABを持つことになりそうのような -

def overlap_count(a, b, num_label): 
    eq_mask = a==b 
    id_mask = a == np.arange(num_label)[:,None, None] 
    count = np.einsum('ij,aij->a',eq_mask, id_mask.astype(int)) 
    return count 

サンプルの実行 -

In [95]: a 
Out[95]: 
array([[0, 1, 2, 1], 
     [2, 0, 2, 2], 
     [0, 1, 1, 0]]) 

In [96]: b 
Out[96]: 
array([[0, 0, 1, 1], 
     [1, 1, 1, 0], 
     [1, 0, 1, 0]]) 

In [97]: overlap_count(a, b, num_label=3) 
Out[97]: array([2, 2, 0]) 

アプローチ#2:メモリ効率の第1のアプローチを改善することができます。 np.bincountでのパフォーマンス。考えている - eq_maskのスケーリングされたバージョンでカウントを行う代わりに、巨大な配列id_maskの作成を避けることができます。このスケーリングされたバージョンは、配列の1つの値によってスケーリングされます。これで、0ラベル付きピクセルのカウントがさらに増えるため、これらのピクセルは別々にカウントされます。私はあなたがここで何をしていたかを理解するために

def overlap_count_improved(a, b, num_label): 
    eq_mask = a==b 
    r = a * eq_mask 
    count = np.bincount(r.ravel()) 
    count[0] = (eq_mask*(a == 0)).sum() 
    # or count[0] = np.einsum('ij,ij->', eq_mask, (a==0).astype(int)) 
    return count 
+0

それはしばらく時間がかかったが、これは問題について行くのは本当にスマートな方法である -

したがって、この第2のアプローチは、このようになります。助けてくれてありがとう! –

関連する問題