血球を数える


7

opencvで血球を数える方法は?問題は、それらがくっつくということです。

サンプル画像:

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

多分ペアワイズ幾何ヒストグラム(Geometric Histograms)は部分的な円形状のマッチングに適していますか?


アカデミックプレスの「顕微鏡画像処理」をお勧めします。オンラインで「循環」している電子ブックがあると聞きました。
heltonbiker 2012

@heltonbiker私のタスクのアルゴリズムは標準の流域アルゴリズムだけでは見つかりませんでした。
mrgloom 2012


@endolithですが、分離可能なブロブはありません。
mrgloom 2012

@mrgloom:なに?あなたは個々の円を数えたいですよね?ブロブではありませんか?
エンドリス2012

回答:


5

成功の保証がない単なるアイデア:

  1. 赤い塊を分離します(たとえば、それらを白、残りの画像を黒としてマークします)
  2. 白いブロブの距離変換を実行します(すべてのピクセルは最も近い黒いピクセルまでの距離を示します)
  3. 非最大抑制を実行します(理想的には円の中心のみが残ります)
  4. 理想的でない条件に対処する(アーチファクトから小さなピークを除外する)

流域アルゴリズムが機能しているように見えますimagejdocu.tudor.lu/…問題は、距離マップが多くの重なり合うオブジェクトを処理できないことです。どういうわけか、円の形状を使用する必要があると思います。dl.dropbox.com/u/8841028/blood%20cells/watershed.png dl.dropbox.com/u/8841028/blood%20cells/distance_map.png
mrgloom

@mrgloom:「円」の形状アスペクトは、ステップ2と3の間にあります。円の場合、エッジまでの最大距離の点が中心です。この特性は、円が重なっている場合でも非常に有効です。結合されたブロブに対して2つの最大値を取得します。各最大値は対応する半径に対応しているので、手順4で簡単に確認できます。期待する円を描き、円と血球の重なりを測定します。
MSalters 2012

1

@SalemMansourの提案と同様に、エリアベースのアプローチでもあります。

仮定できれば、かなり大まかな見積もりを計算できます。

  • セルサイズ(ピクセル単位)は、すべての画像であまり変わらないこと、
  • セルの色はすべての画像であまり変わらないことに注意してください。

次に、セルの平均サイズを事前に測定し、次のようにセルの安価なマスクを計算できます。

from SimpleCV import *
im = Image("s58Hl.jpg")
r,g,b = im.splitChannels()
cellmask = g.equalize().threshold(90).invert()
masksize = cellmask.getGrayNumpy().sum()/255.
cellsize = 27*27 # premeasured cell size
cellnum = masksize/cellsize
print(cellnum)

セル数は約211です。

マスクイメージは次のようになります。 ここに画像の説明を入力してください

この小さい画像の場合、手動で9つのセルを数えます。

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

ソリューションは9.46502057613の結果を返します。


もちろん、いずれかの仮定が無効である場合、このアプローチは役に立ちません。また、ハードカラーのしきい値とセルサイズの定数にも敏感です。色の均一化のため、画像にセルが存在しない場合は完全に失敗する可能性があります。

しかし、それは本当にシンプルで安いです:)


-1

まず、しきい値、大津メソッドを使用して、イメージをバイナリイメージに変更する必要があります。浸食、開口などの数学的形態を使用して、セル(オーバーラップしたセル)を分離できます。面積を見積もります。


1
私はこの答えがとても好きで、私がお勧めするものはほとんどですが、それは少し不明確です。わかりやすくするために少し編集できるとしたら、間違いなく賛成票を投じます。
nivag 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.