申し訳ありませんが、OpenCVはわかりません。これは完全な答えというよりも前処理のステップです。
まず、エッジ検出器は必要ありません。エッジ検出器は、トランジションを変換します(この暗から明へ):
このような尾根(暗闇の明るい線)に:
つまり、差別化を実行します。
しかし、あなたの画像には、一方向から降り注ぐ光があり、3D表面の浮き彫りを示しています。3Dで物事を見ることに慣れているので、これを線とエッジとして認識しますが、実際にはそうではないため、エッジ検出器が機能せず、テンプレートマッチングは回転した画像では簡単に機能しません(完璧な0度の回転で一致すると、実際には180度で完全に相殺されます。これは、明るい部分と暗い部分が互いに並ぶためです。
これらの曖昧な線のいずれかの高さが側面からこのように見える場合:
片側から照らされたときの輝度関数は次のようになります。
これが画像に表示されるものです。対向面はより明るくなり、後面はより暗くなります。だから、差別化したくない。照明の方向に沿って画像を統合する必要があります。これにより、表面の元の高さマップ(およそ)が得られます。そうすれば、ハフ変換やテンプレートマッチングなどを介して、物事を簡単に一致させることができます。
照明の方向を自動化する方法がわかりません。すべての画像で同じ場合、素晴らしい。それ以外の場合は、最大のコントラストラインを見つけて、光がそれに垂直か何かを仮定する必要があります。私の例では、画像を手動で右方向と思われる方向に回転させ、光が左から来るようにしました。
ただし、急速に変化する線のような特徴のみを強調表示するには、画像内の低周波数の変更をすべて削除する必要もあります。リンギングアーティファクトを回避するために、2Dガウスぼかしを使用し、元のぼかしからそれを減算しました。
統合(累積合計)は簡単に暴走する可能性があり、水平線が発生します。別のガウスハイパスでこれらを削除しましたが、今回は水平方向のみです。
現在、気孔は、ある場所では白で、他の場所では黒ではなく、ずっと白い楕円です。
元の:
統合された:
from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d
filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)
# Remove DC offset
I = I - average(I)
close('all')
figure()
imshow(I)
gray()
show()
title('Original')
# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)
figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)
# Integrate
summed = cumsum(I, 1)
# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)
figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)
ハフ変換、それが計算され、メモリに本当に高価だが、「エッジ画素」で作られた、このようなリッジ楕円を検出するために使用され、それは「ずさん」検出器のビットでなければならないので、彼らは完璧な楕円形ではありませんすることができます。私はそれをやったことがありませんが、「ハフ楕円検出に関する」。特定のサイズの検索スペース内で、一方の楕円をもう一方の内部で検出した場合、ストーマとしてカウントする必要があります。
参照: