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