watershed issue

jip jeanpatrick.pommier at gmail.com
Wed Dec 28 14:05:50 EST 2011


Dear all,
I try to use watershed implemenation in skimage, compared with scipy as 
follow:

# -*- coding: utf-8 -*-
"""
Created on Thu Dec 22 13:45:46 2011

@author: Jean-Patrick Pommier
Telomeres quantification at low resolution with skimage
"""

import scipy.ndimage as nd
import pylab as plb
import numpy as np

import skimage as sk
import skimage.morphology as mo
import skimage.io as io
import skimage.filter.edges as edges

#import mahotas as mh
#import pymorph


def gray12_to_8(im):
    '''Converts a 12 bits image to 8 bits '''
    i=0.062271062*im
    return np.uint8(i)
    
def Hipass(im,size=9):
    '''returns a hipass filtered image with background >=0 with a gaussian 
filter 
    of size size=9 by default'''
    blur=blur=nd.gaussian_filter(im,size)
    hi=im-1.0*blur-5
    mask=np.copy(hi)
    hi[mask<0]=0
    return hi
    
def gray_dist(im):
    '''Build a pseudo distance map from a high pass filtered image suitable
    for watershed'''
    f=Hipass(im,9)
    dist=f.max()-f
    dist -= dist.min()
    dist = dist/float(dist.ptp()) * 255
    dist = dist.astype(np.uint8)
    return dist
#==============================================================================
# images 
#==============================================================================
path="/home/claire/Applications/ImagesTest/JPP50/16/"
CC="DAPI/"
PR="CY3/" 
im="1.TIF"

#sk.io.use_plugin('gdal', 'imread') 
sk.io.use_plugin('freeimage', 'imread') 
sk.io.use_plugin('matplotlib', 'imshow') 
dapi=io.imread(path+CC+im)
cy3=io.imread(path+PR+im)

#=============================================================================
# Extracting known nuclei
#==============================================================================
nuc=dapi[215:264,1151:1198]
telo=cy3[215:264,1151:1198]
telo=np.uint16(telo)
#==============================================================================
# Telomeres Segmentation with skimage & ndimage
print telo.dtype

se=mo.disk(7)
top=mo.greyscale_white_top_hat(gray12_to_8(telo),se)
#print top.min(),top.max(),top.dtype
hi=np.uint8(Hipass(top,size=9))
#print hi.min(), hi.max(),hi.dtype
dist=nd.distance_transform_bf(top>10)
bassin_dist=np.uint16(dist.max()-dist)
bassin_hi=hi.max()-hi
remax=mo.is_local_maximum(bassin_hi,hi>6)
markers,n=nd.label(remax)
print n, 'spots detected'
edgesmap=edges.sobel(hi)
seg=sk.morphology.watershed(edgesmap,markers,top>30)
segn=nd.watershed_ift(bassin_hi,markers)
segn_mark_dist=nd.watershed_ift(bassin_dist,markers)
#==============================================================================
# Quantification
#==============================================================================
print top.shape,top.dtype
#print np.shape(seg),np.dtype(seg)
#spots_I=nd.measurements.sum(top,seg)
#print spots_I
#==============================================================================
# 
#==============================================================================
plb.figure(1)
plb.subplot(341,frameon=False, xticks=[], yticks=[])
plb.title('raw 12bits')
plb.imshow(telo)
plb.subplot(342,frameon=False, xticks=[], yticks=[])
plb.title('top Hat')
plb.imshow(top)
plb.subplot(343,frameon=False, xticks=[], yticks=[])
plb.title('hiP')
plb.imshow(hi)
plb.subplot(344,frameon=False, xticks=[], yticks=[])
plb.title('regional max')
plb.imshow(remax,interpolation=None)
plb.subplot(345,frameon=False, xticks=[], yticks=[])
plb.title('markers')
plb.imshow(markers,interpolation=None)
plb.subplot(346,frameon=False, xticks=[], yticks=[])
plb.title('bassin=hi')
plb.imshow(bassin_hi,interpolation=None)
plb.subplot(347,frameon=False, xticks=[], yticks=[])
plb.title('bassin dist')
plb.imshow(bassin_dist,interpolation=None)
plb.subplot(348,frameon=False, xticks=[], yticks=[])
plb.title('hi+mark (nd)')
plb.imshow(segn,interpolation=None)
plb.subplot(349,frameon=False, xticks=[], yticks=[])
plb.title('sobel (sk)')
plb.imshow(edgesmap,interpolation=None)
plb.subplot(3,4,10,frameon=False, xticks=[], yticks=[])
plb.title('sob+mark (sk)')
plb.imshow(seg,interpolation=None)
plb.subplot(3,4,12,frameon=False, xticks=[], yticks=[])
plb.title('dist+mark (nd)')
plb.imshow(segn_mark_dist,interpolation=None)
 
plb.show()


<https://lh5.googleusercontent.com/-OBPfUOGJNok/TvtKO_6q20I/AAAAAAAAAqw/6VX7eIrySXA/s1600/watershedissue.png>

I get a strange result, see the "sob+mark (sk)" image, compared to the 
segmentations obtained with the scipy implementation.

Is it a skimage bug ? Best regards.

Jean-Patrick 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scikit-image/attachments/20111228/30dcec97/attachment.html>


More information about the scikit-image mailing list