Advice on improving a analysis on images of nanoparticles

Guillaume Gay guillaume at mitotic-machine.org
Mon Nov 25 03:27:17 EST 2013


For the uneven background issue, you can always filter out the low 
frequency parts of the image. You can do this in Fourrier space, or just 
subtract a Gaussian filtered version of the image:

|from  skimageimport  img_as_float
from  scipyimport  ndimage

def  preprocess_highpass(image, filter_width=100):
     '''Emulates a highpass filter by subtracted a smoothed version
     of the image from the image.

     Parameters:
     ----------------
     image: a ndarray
     filter_width: an int, should be much bigger than the relevant features in the image,
         and about the scale of the background variations

     Returns:
     -----------
     f_image: ndarray with the same shape as the input image, with float dtype, the filtered image,
         with minimum at 0.
     '''

     image = img_as_float(image)
     lowpass = ndimage.gaussian_filter(image, filter_width)
     f_image = image - lowpass
     f_image -= f_image.min()
     return  f_image|

On 25/11/2013 08:49, Evelyn Liu wrote:

> Thanks for your helpful response Juan. But I have the issue with 
> choosing parameter for threshold_adaptive.. Some of my images have 
> uneven contrast, like the lower part of image has darker background 
> compared to the upper part. So if the threshold is proper for the 
> upper part, some neighboring particles will be taken as a cluster even 
> they are individual. I tried different diam, but none of them leads to 
> good threshold in terms of the full image. Is there any other 
> thresholding methods for those uneven contrast images?
>
> I also tried the edge operator /filter.sobel /and it looks good for 
> drawing up particles' edges(the attached image). I wonder if i can 
> fill these circles up to get the thresholding image?  I tried 
> /ndimage.//binary_fill_holes /but it gives me either blank or total 
> total black pic..
>
> <https://lh6.googleusercontent.com/-89xSmEmy7Wc/UpL_fNubbSI/AAAAAAAAAB8/0N-N1cf-374/s1600/edge_invert_wraped1.png>
>
>
>
>
> On Wednesday, November 20, 2013 12:33:19 AM UTC-5, Juan Nunez-Iglesias 
> wrote:
>
>     Hi Evelyn,
>
>     I'm guessing you are applying label() directly to your image,
>     which is not the right way to use it. label() connects all
>     neighboring *nonzero* points together. Since images are rarely
>     zero (rather than some very small intensity value), you are simply
>     connecting all the pixels of your image together into one label.
>
>     The correct way to do this is to threshold your image, eg using:
>     http://scikit-image.org/docs/dev/api/skimage.filter.html#threshold-adaptive
>     <http://www.google.com/url?q=http%3A%2F%2Fscikit-image.org%2Fdocs%2Fdev%2Fapi%2Fskimage.filter.html%23threshold-adaptive&sa=D&sntz=1&usg=AFQjCNG3r7Y-dZ9r6IBjOojwF1eoEgwp1Q>
>
>     So:
>
>     >>> from skimage.filter import threshold_adaptive
>     >>> from scipy import ndimage as nd
>     >>> diam = 51
>     >>> # "51" is a guess, you might have to fiddle with this parameter.
>     >>> image_t = (image > threshold_adaptive(image, diam))
>     >>> image_labeled = nd.label(image_t)[0]
>     >>> particle_sizes = np.bincount(image_labeled.ravel())[1:]
>     >>> # [1:] is to select only the foreground labels
>
>     Hope this helps!
>
>     Juan.
>
>
>
>     On Wed, Nov 20, 2013 at 3:45 PM, Evelyn Liu <eve... at gmail.com
>     <javascript:>> wrote:
>
>         Hi Juan,
>
>         On Tuesday, November 19, 2013 9:39:47 PM UTC-5, Juan
>         Nunez-Iglesias wrote:
>
>             Is the goal only to count particles? In that case, I think
>             a local thresholding (threshold_adaptive) would work on
>             all these images. Then, just do a labelling
>             (scipy.ndimage.label) and draw a histogram of particle
>             sizes. You'll get a sharp peak around the true particle
>             size, with bigger peaks for clumps
>
>
>         I'd like to use scikit to plot the size distribution histogram
>         of particles in an image, which is similar with Adam's. I
>         tried scipy.ndimage.measurements.label(image), which I thought
>         would give an array about particle sizes. However, the output
>         array is with all 1, obviously nothing about size. I must get
>         something wrong...So which function should i call for the size
>         distribution? Thanks Juan!
>
>
>         -- 
>         You received this message because you are subscribed to the
>         Google Groups "scikit-image" group.
>         To unsubscribe from this group and stop receiving emails from
>         it, send an email to scikit-image... at googlegroups.com
>         <javascript:>.
>         For more options, visit
>         https://groups.google.com/groups/opt_out
>         <https://groups.google.com/groups/opt_out>.
>
>
> -- 
> You received this message because you are subscribed to the Google 
> Groups "scikit-image" group.
> To unsubscribe from this group and stop receiving emails from it, send 
> an email to scikit-image+unsubscribe at googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scikit-image/attachments/20131125/1eaf12e7/attachment.html>


More information about the scikit-image mailing list