2

いくつかの大腸菌を示すいくつかの顕微鏡明視野画像をセグメント化しようとしています。私が取り組んでいる写真は、これに似ています (これが位相差で得られたとしても):

顕微鏡明視野画像

私の問題は、セグメンテーション関数 (以下の OtsuMask) を実行した後、分裂しているバクテリアを区別できないことです (サンプル画像で以下のコードを試すことができます)。これは、2 つの異なるラベル付き画像ではなく、端で結合された 2 つのバクテリアに対して 1 つのラベル付き領域を取得することを意味します。2 つの分裂しているバクテリアの間の境界は狭すぎて、しきい値処理された画像に対して実行する形態学的操作によって強調表示できませんが、私の目標を達成する方法があるに違いないと思います。

アイデア/提案はありますか?

import scipy as sp
import numpy as np
from scipy import optimize
import mahotas as mht
from scipy import ndimage
import pylab as plt


def OtsuMask(img,dilation_size=2,erosion_size=1,remove_size=500):

    img_thres=np.asarray(img)
    s=np.shape(img)    
    p0=np.array([0,0,0])

    p0[0]=(img[0,0]-img[0,-1])/512.    
    p0[1]=(img[1,0]-img[1,-1])/512.
    p0[2]=img.mean()

    [x,y]=np.meshgrid(np.arange(s[1]),np.arange(s[0]))

    p=fitplane(img,p0)    
    img=img-myplane(p,x,y)    


    m=img.min()
    img=img-m
    img=abs(img)
    img=img.astype(uint16)

    """perform thresholding with Otsu"""
    T = mht.thresholding.otsu(img,2)
    print T
    img_thres=img
    img_thres[img<T*0.9]=0
    img_thres[img>T*0.9]=1


    img_thres=-img_thres+1  

    """morphological operations"""
    diskD=createDisk(dilation_size)
    diskE=createDisk(erosion_size)

    img_thres=ndimage.morphology.binary_dilation(img_thres,diskD)   

    labeled_im,N=mht.label(img_thres)
    label_sizes=mht.labeled.labeled_size(labeled_im)
    labeled_im=mht.labeled.remove_regions(labeled_im,np.where(label_sizes<remove_size))    


    figure();
    imshow(labeled_im)

    return labeled_im

def myplane(p,x,y):

    return p[0]*x+p[1]*y+p[2] 

def res(p,data,x,y):

    a=(data-myplane(p,x,y));

    return array(np.sum(np.abs(a**2)))

def fitplane(data,p0):

    s=shape(data);

    [x,y]=meshgrid(arange(s[1]),arange(s[0]));
    print shape(x), shape(y)

    p=optimize.fmin(res,p0,args=(data,x,y));
    print p
    return p


def createDisk( size ):
    x, y = np.meshgrid( np.arange( -size, size ), np.arange( -size, size ) )
    diskMask = ( ( x + .5 )**2 + ( y + .5 )**2 < size**2)
    return diskMask

OtsuMask のコードの最初の部分は、平面フィッティングと減算で構成されています。

4

3 に答える 3

0

いくつかの考え:

  1. Otsu は、固定のしきい値を使用することもできるため、適切な選択ではない可能性があります (バクテリアは黒です)。
  2. どの方法でも画像をしきい値処理すると、多くの有用な情報が削除されます。

完全なレシピはありませんが、この非常に単純なことでさえ、多くの興味深い情報を提供しているようです。

import matplotlib.pyplot as plt
import cv2

# cv2 is only used to read the image into an array, use only green channel
bact = cv.imread("/tmp/bacteria.png")[:,:,1]

# draw a contour image with fixed threshold 50
fig = plt.figure()
ax = fig.add_subplot(111)
ax.contourf(bact, levels=[0, 50], colors='k')

これは与える:

ここに画像の説明を入力

これは、固定された輪郭で輪郭追跡技術を使用すると、拡張と侵食の非常に見栄えの良い開始点が得られることを示唆しています。そのため、しきい値処理の 2 つの違いは次のとおりです。

  1. 輪郭は、単純な黒/白のしきい値よりも多くのグレースケール情報を使用します。
  2. 固定しきい値はこれらの画像でうまく機能するようです。照明補正が必要な場合、Otsu は最良の選択ではありません。
于 2014-07-14T19:03:56.350 に答える