Advice on improving a analysis on images of nanoparticles

Evelyn Liu evelzw at gmail.com
Tue Nov 26 13:47:01 EST 2013


This is really helpful. Thanks Guillaume!

On Monday, November 25, 2013 3:27:17 AM UTC-5, Guillaume wrote:
>
>  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 skimage import img_as_floatfrom scipy import 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> 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.
>>> For more options, visit 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... at googlegroups.com <javascript:>.
> 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/20131126/587dd95c/attachment.html>


More information about the scikit-image mailing list