2

일부 현미경으로 밝은 영역 이미지를 분할하려고합니다. E. coli 박테리아. I 유사한와 (본는 위상 콘트라스트를 얻을 경우에도) 이것을 일하고 사진 :현미경 이미지 세분화 : 파이썬으로 세균 세분화

microscopy bright-field image

내 문제 내 세그멘테이션 기능을 실행 한 후 (아래 OtsuMask) I는 (분할 박테리아를 구별 할 수 있다는 것이다을 샘플 코드에서 아래 코드를 사용해보십시오.) 즉, 두 개의 서로 다른 레이블이있는 이미지 대신 끝에 붙어있는 두 개의 박테리아에 대해 하나의 레이블이 지정된 영역을 얻게됩니다. 박테리아를 구분하는 경계가 너무 좁아서 임계 값 이미지에서 수행하는 형태 작업에 의해 강조 표시되지 않지만 내 목표를 달성 할 수있는 방법이 있어야합니다.

아이디어가 있습니까?

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 IN 코드의 첫번째 부분은 평면 FITTING AND 감산 이루어져있다.

+0

그리고 개봉을하면 어떻게됩니까? – kkuilla

+0

감사합니다 kkuilla 당신이 의견을. 처음 시도한 것은 내가 시도한 첫 번째 결과 중 하나였습니다. 결과는 그렇게 흥미롭지 않았습니다 .. – JacoSolari

답변

1

this related stackoverflow answer에 설명 된 방법과 유사한 방법을 사용할 수 있습니다.

그것은 다음과 같이 기본적으로 간다 : 당신이되도록 거리가 거리 변환 역치 이미지

  • 임계 값에 변환을 적용

  • 을했던 것처럼,

    • 임계 이미지 각 박테리아의 작은 '종자'부분 만 남아있다

    • 이러한 종자는 회색
      각각 다른 그늘은 박테리아의 separatd 윤곽을 얻기 위해,이 씨 유역 알고리즘과의 거리 변화 이미지를 실행

    • (또한 배경 레이블 씨를 추가)

    훨씬 명확하게 이해할 수있는 그림에 대한 링크 된 답변을 확인하십시오.

  • +0

    답변과 링크는 HugoRune에게 감사드립니다! 이미 유역을 사용하려했지만 거리 변환을 임계하지 않았으므로 씨앗이 상당히 크고 다양했습니다. 아티팩트는 때때로 원하지 않는 작은 씨앗에서 발생하지만 거리 변환을 thresholding하면 도움이됩니다! 감사합니다. – JacoSolari

    0

    몇 가지 생각 : 당신도 고정 된 임계 값을 (당신의 박테리아가 검은 ​​색)를 사용할 수 있으므로

    1. 오츠는 좋은 선택이 될 수 없습니다.
    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') 
    

    이 제공 :

    enter image description here

    을 이것은 고정 된 윤곽선으로 윤곽 추적 기법을 사용하면 확장 및 침식에 대해 아주 멋진 시작점을 제공한다는 것을 의미합니다. 따라서 임계 설정의 두 가지 차이점은 다음과 같습니다.

    1. Contouring은 단순한 흑백 임계 값보다 더 많은 회색 명암 정보를 사용합니다.
    2. 고정 된 임계 값은 이러한 이미지에서 잘 작동하는 것으로 보이며 조명 보정이 필요한 경우 오츠 (Otsu)가 최선의 선택이 아닙니다.
    +0

    DrV. 이것은 매우 유용합니다, 나는 윤곽선 추적과 침식/팽창으로 놀아 보려고 노력할 것입니다! – JacoSolari

    0

    언젠가는 skimage Watershed segmentation이 OpenCV 샘플보다 유용했습니다. Cellprofiler 프로젝트 (정교한 셀 이미지 분석을위한 python 기반 도구)에서 빌린 일부 코드를 사용합니다. 힌트 : Euclidean distance transform from opencv을 사용하면 scipy 구현보다 빠릅니다. 또한 peak_local_max 기능은 거리 매개 변수를 가지므로 정밀한 단일 셀 구별에 유용합니다. 나는이 기능이 무의미한 문턱보다 세포 봉우리를 발견하는데 더 강력하다고 생각한다. (세포의 강도가 다를 수 있기 때문이다.)

    scipy 유역 구현을 찾을 수 있지만 이상한 동작이 있습니다.