2016-08-13 20 views
3

私は、このフォトショップモックアップから(不十分な)図示されているように、2D画像上の一種の方向フィールドを計算したいと思います。注:これは、微分方程式について学ぶとき、ベクトル場ではありません。代わりに、これは、彼らが画像のレベルセットを計算したかどうかを見る線に沿って描くものです。 イメージの方向フィールドを計算するための標準的な方法はありますか?

Example

は、方向フィールドのこのタイプのイメージの(赤線)を得る方法が知られていますか?グラデーションの法線のように動作するようですが、グラデーションが0の場所があり、これらの場所の方向フィールドも必要とするので、これはまったく同じではありません。

+0

@rayryeng - あなたはポイントを逃した。私は微分方程式のようにベクトル場を描く方法を尋ねるのではなく、画像の方向または方向フィールドのようなものをどのように計算するかを尋ねています。これはまったく異なっています。これは誤解を招くので、私の質問を重複ではないとマークするにはどうすればよいですか? – Rachel

+0

あなたの答えの背後に詳細を書いたら、重複フラグを削除する傾向があります。ほとんどの人がアクセスできない紙を読んでもらうことは有益な答えではありません。 – rayryeng

+0

ハハ、よくやってよ!しかし、この質問にはあまり関心がないようでしたので、私はただちに返信しました。それは私に、重複としてマークするだけでなく、より詳細を提供するように依頼するほうが確かに良いでしょう。私はより詳細な書面で作業します。 – Rachel

答えて

2

私は指紋処理のためにこれを行う方法についての論文を見つけることができました。その結果、その結果は繰り返し可能です。これは、ペイウォールの後ろに、残念ながらですが、ここでは誰のために興味を持って、フルテキストにアクセスすることが可能である:

Systematic methods for the computation of the directional fields and singular points of fingerprints


EDIT:要求されたようは、ここではPythonで(迅速かつ汚い要約したものです)これは上記の論文でどのように達成されたのか。

単純なアプローチは、問題の画像上の重ね合わせたグリッドのように、ターゲットピクセルの周りの小さな四角い近傍の勾配を平均化し、次に法線を計算することです。ただし、グラデーションを平均化するだけでは、リージョンの反対のグラデーションが互いに打ち消し合う可能性があります(たとえば、リッジに沿った向きを計算する場合)。したがって、反対方向を向いている勾配が整列されるので、2乗勾配で計算するのが一般的である。元の勾配に基づいて二乗勾配の賢明な公式があります。私は導出を与えるが、ここで式はありません。

を今、(角度の働き方のために、いくつかの区分的に定義補償を法)領域の上に乗勾配の合計を取ります。最後に、いくつかのアークタンジェントな魔法を通して、方向フィールドを取得します。

グリッドサイズを適切に選択して滑らかなグレースケールビットマップイメージで次のコードを実行し、元のイメージの横にオリエンテーションフィールドOをプロットすると、どのようにオリエンテーションフィールドの角度I私の元の質問について尋ねられた。

from scipy import misc 
import numpy as np 
import math 

# Import the grayscale image 
bmp = misc.imread('path/filename.bmp') 

# Compute the gradient - VERY important to convert to floats! 
grad = np.gradient(bmp.astype(float)) 

# Set the block size (superimposed grid on the sample image in the question) 
blockRadius=5 

# Compute the orientation field. Result will be a matrix of angles in [0, \pi), one for each pixel in the original (grayscale) image. 

O = np.zeros(bmp.shape) 

for x in range(0,bmp.shape[0]): 
    for y in range(0,bmp.shape[1]): 
     numerator = 0. 
     denominator = 0. 
     for i in range(max(0,x-blockRadius),min(bmp.shape[0],x+blockRadius)): 
      for j in range(max(0,y-blockRadius),min(bmp.shape[0],y+blockRadius)): 
       numerator = numerator + 2.*grad[0][i,j]*grad[1][i,j] 
       denominator = denominator + (math.pow(grad[0][i,j],2.) - math.pow(grad[1][i,j],2.)) 
     if denominator==0: 
      O[x,y] = 0 
     elif denominator > 0: 
      O[x,y] = (1./2.)*math.atan(numerator/denominator) 
     elif numerator >= 0: 
      O[x,y] = (1./2.)*(math.atan(numerator/denominator)+math.pi) 
     elif numerator < 0: 
      O[x,y] = (1./2.)*(math.atan(numerator/denominator)-math.pi) 

for x in range(0,bmp.shape[0]): 
    for y in range(0,bmp.shape[1]): 
     if O[x,y] <= 0: 
      O[x,y] = O[x,y] + math.pi 
     else: 
      O[x,y] = O[x,y] 

乾杯!

+0

あなたの数式をイメージに変換する自由を取る。乾杯と編集のおかげで! – rayryeng

関連する問題