私は指紋処理のためにこれを行う方法についての論文を見つけることができました。その結果、その結果は繰り返し可能です。これは、ペイウォールの後ろに、残念ながらですが、ここでは誰のために興味を持って、フルテキストにアクセスすることが可能である:
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]
乾杯!
@rayryeng - あなたはポイントを逃した。私は微分方程式のようにベクトル場を描く方法を尋ねるのではなく、画像の方向または方向フィールドのようなものをどのように計算するかを尋ねています。これはまったく異なっています。これは誤解を招くので、私の質問を重複ではないとマークするにはどうすればよいですか? – Rachel
あなたの答えの背後に詳細を書いたら、重複フラグを削除する傾向があります。ほとんどの人がアクセスできない紙を読んでもらうことは有益な答えではありません。 – rayryeng
ハハ、よくやってよ!しかし、この質問にはあまり関心がないようでしたので、私はただちに返信しました。それは私に、重複としてマークするだけでなく、より詳細を提供するように依頼するほうが確かに良いでしょう。私はより詳細な書面で作業します。 – Rachel