植物顕微鏡画像で気孔を見つける


26

画像処理の専門家への質問です。

私は難しいコンピュータービジョンの問題に取り組んでいます。タスクは、DIC顕微鏡画像で気孔(以下にマーク)をカウントすることです。これらの画像は、モルフォロジー演算やエッジ検出など、ほとんどの表面的な画像処理技術に耐性があります。また、他のセルカウントタスクとは異なります。

OpenCVを使用しています。私の計画は、気孔の識別に役立つ可能性のある機能を確認することです。

  • テクスチャ分類子
    • DCT(離散コサイン変換/周波数領域分析)
    • LBP(ローカルバイナリパターン)
  • HOG(方向付けられた勾配のヒストグラム)
  • 堅牢な特徴検出器(私は懐疑的です)
    • ハリスコーナー
    • SIFT、SURF、STARなど
  • Haarカスケード分類器/ Viola-Jonesの機能

そして、おそらく新しい機能記述子を設計します。今のところ、分類子の選択は省略しています。

私は何を見逃しましたか?これをどのように解決しますか?同様のオブジェクト検出問題の解決策は非常に役立ちます。

サンプル画像はこちら

気孔

バンドパスフィルター後: バンドパスフィルター

キャニーエッジの検出は有望ではありません。一部の画像領域は焦点が合っていません。 キャニーエッジ検出


1
気孔を見つけようとする代わりに、不気味な線を削除しようとすることができますか?
エンドリス

1
いくつの画像を処理する必要がありますか?どのくらいの速さが必要ですか?どの程度自動化する必要がありますか?
エンドリス

1
非常に高速である必要はありません。私たちは1000枚の画像を処理しています。それは自動でなければなりません-イメージをディレクトリにダンプしてください。
マットM.

回答:


15

申し訳ありませんが、OpenCVはわかりません。これは完全な答えというよりも前処理のステップです。

まず、エッジ検出器は必要ありません。エッジ検出器は、トランジションを変換します(この暗から明へ):

    _____ / ‾‾‾‾‾

このような尾根(暗闇の明るい線)に:

    ____ / _____

つまり、差別化を実行します。

しかし、あなたの画像には、一方向から降り注ぐ光があり、3D表面の浮き彫りを示しています。3Dで物事を見ることに慣れているので、これを線とエッジとして認識しますが、実際にはそうではないため、エッジ検出器が機能せず、テンプレートマッチングは回転した画像では簡単に機能しません(完璧な0度の回転で一致すると、実際には180度で完全に相殺されます。これは、明るい部分と暗い部分が互いに並ぶためです。

これらの曖昧な線のいずれかの高さが側面からこのように見える場合:

    ____ / _____

片側から照らされたときの輝度関数は次のようになります。

    ____∧v____

これが画像に表示されるものです。対向面はより明るくなり、後面はより暗くなります。だから、差別化したくない。照明の方向に沿って画像を統合する必要があります。これにより、表面の元の高さマップ(およそ)が得られます。そうすれば、ハフ変換やテンプレートマッチングなどを介して、物事を簡単に一致させることができます。

照明の方向を自動化する方法がわかりません。すべての画像で同じ場合、素晴らしい。それ以外の場合は、最大のコントラストラインを見つけて、光がそれに垂直か何かを仮定する必要があります。私の例では、画像を手動で右方向と思われる方向に回転させ、光が左から来るようにしました。

オリジナル、回転

ただし、急速に変化する線のような特徴のみを強調表示するには、画像内の低周波数の変更をすべて削除する必要もあります。リンギングアーティファクトを回避するために、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)

ハフ変換、それが計算され、メモリに本当に高価だが、「エッジ画素」で作られた、このようなリッジ楕円を検出するために使用され、それは「ずさん」検出器のビットでなければならないので、彼らは完璧な楕円形ではありませんすることができます。私はそれをやったことがありませんが、「ハフ楕円検出に関する」。特定のサイズの検索スペース内で、一方の楕円をもう一方の内部で検出した場合、ストーマとしてカウントする必要があります。

参照:


PSここでやったことには名前がありますか?一般的なフィルタータイプですか?
エンドリス

1
+1-すばらしい回答です!光源角度の自動化について-マグニチュードとグラディエントの両方を計算し、グラディエントの加重(マグニチュード)平均を計算するエッジ検出器を使用できます。最も強い反応は、照明の方向にあるべきです。
アンドレイRubshtein

11

私が最初に試したいことは、テンプレートを一致させることです。テンプレートはすべての角度で少しずつ回転します。ここで不可欠な回転テンプレート。また、テンプレートの選択は自明ではない可能性があります-異なる照明を持つ複数の可能性があり、形状の違いを考慮してぼかします。

http://en.wikipedia.org/wiki/Template_matching#Template-based_matching_and_convolution

次に-HOGはここで有望に見えます。別の解決策は、MoravecやShi-Tomasi(非最大抑制)のような強力なコーナー検出器を使用して、候補と同じラインで2コーナーまたは3-4コーナーのグループを探すことです。候補を見つけたら、アクティブな輪郭を検証に適用できます(本当に役立つかどうかはわかりませんが、可能性はあります)

http://en.wikipedia.org/wiki/Corner_detector

http://en.wikipedia.org/wiki/Active_contour

さらに別の可能性は、おそらく2ではなく3-4の自由なパラメーターで、楕円にハフ変換を使用することです。


7

部分的な答え。Mathematicaで候補を見つける:

p = ColorConvert[Import@"http://i.stack.imgur.com/38Ysw.jpg", 
    "GrayScale"] // ImageAdjust;
m = DeleteSmallComponents[Erosion[Dilation[DeleteSmallComponents[
      Binarize[EntropyFilter[p, 1] // ImageAdjust, .97], 10], 3], 5], 100];
ImageMultiply[Dilation[m, 3], p]

ここに画像の説明を入力してください


興味深い結果は...多分いくつかの他の方式...と組み合わせる
マット・M.

@MAtt Yep対象外のサーフェスの少なくとも80%を破棄したと思います。マスクを少し拡張した後、楕円を検索する必要があります。使用する方法に関係なく(私はまだできることを考えています)、獣が囲まれていることがわかったので、はるかに簡単です。
ベリサリウス博士

1

まず、高感度のエッジ検出器(低しきい値の勾配強度など)を使用してから、ハフ変換を使用して楕円を見つけようとします。キャニーも同様に動作する可能性があります。微調整して感度を高め、ぼやけたエッジを拾うことができるパラメーターがあると確信しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.