我正在尝试对显示某些大肠杆菌的显微镜明视野图像进行分段。我正在处理的图片类似于此图片(即使此图片是通过相衬获得的):
我的问题是,运行分割功能(下面的OtsuMask)后,我无法区分正在分裂的细菌(您可以在示例图像上尝试下面的代码)。这意味着我得到了一对细菌的单个标记区域,这些细菌的末端相连,而不是两个不同的标记图像。我在阈值图像上执行的形态学操作无法区分两个分裂细菌之间的边界,但是我想必须有一种方法可以实现我的目标。
有什么想法/建议吗?
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中代码的第一部分由平面拟合和精简组成。
在此可以使用与此相关stackoverflow答案中描述的方法类似的方法。
它基本上是这样的:
像完成阈值操作一样
在阈值图像上应用距离变换
设定距离转换的阈值,以便每种细菌仅保留一小部分“种子”
标记这些种子,为每个种子赋予不同的灰色阴影
(还为背景添加一个标记的种子)
使用这些种子和距离变换后的图像执行分水岭算法,以获取细菌的分离轮廓
查看链接的答案中的一些图片,这些图片可以使内容更加清晰。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句