Areas of contours

Maik Riechert maik.riechert at arcor.de
Wed Sep 10 10:05:12 EDT 2014


I just did a test on a 3000x3000 image comparing both approaches. Note that 
I have very few (one to three) contours where there is one big that is 
typically 50-70% of the whole image. My contour-only way takes 0.13secs, 
the other one that you suggested takes 4secs where 95% of the time is spent 
on accessing the area property of a single region prop. Why is that so slow?

Am Mittwoch, 10. September 2014 15:26:43 UTC+2 schrieb Juan Nunez-Iglesias:
>
> p.image contains an image of just that one region, within bbox. Note that 
> regionprops have lazy evaluation, so the code mentioned above should be 
> reasonably fast — possibly faster than evaluating contours for the whole 
> image first. Also note that unless you port it to Cython, your area 
> function on the contours will be pretty slow.
>> Sent from Mailbox <https://www.dropbox.com/mailbox> 
>
>
> On Wed, Sep 10, 2014 at 11:20 PM, Maik Riechert <maik.r... at arcor.de 
> <javascript:>> wrote:
>
>> Hi Juan,
>>
>> how would I do step 5? Even if I know the bounding box it could still be 
>> that parts of other regions are in the box, right?
>>
>> I'm not sure if all that would be a bit too slow if it worked. My images 
>> are 4000x3000 and I guess there's a noticeable performance advantage of 
>> doing all further calculations just on the contours instead of the image 
>> itself.
>>
>> Cheers
>> Maik
>>
>> Am Mittwoch, 10. September 2014 15:04:27 UTC+2 schrieb Juan 
>> Nunez-Iglesias:
>>>
>>> Hey Maik,
>>>
>>> But what about:
>>>
>>> 1) Do a scipy.ndimage.binary_fill_holes to ensure that objects 
>>> constitute the full area from a contour
>>> 2) Do a scipy.ndimage.label to give a unique ID to each blob of 1s in 
>>> the image.
>>> 3) get props = skimage.regionprops(im) to get the properties of each blob
>>> 4) you can then find the argmax of [p.area for p in props]
>>> 5) you can then compute the contour of just that object, and offset the 
>>> coordinates using the .bbox property
>>>
>>> Would this work? It all depends on your purposes, and I’m also not sure 
>>> which would be most efficient.
>>>
>>> Juan.
>>>>>> Sent from Mailbox <https://www.dropbox.com/mailbox> 
>>>
>>>
>>> On Wed, Sep 10, 2014 at 10:29 PM, Maik Riechert <maik.r... at arcor.de> 
>>> wrote:
>>>
>>>> My goal is to determine the biggest contour that covers 1's in the 
>>>> binary image and return it, therefore I thought I first use find_contours 
>>>> and then calculate the area of each contour to get the right one. I'm not 
>>>> sure if regionprops helps me here. In the meantime I adapted a function 
>>>> from stackoverflow:
>>>>
>>>>  def polygonArea(poly):
>>>>     """
>>>>     Return area of an unclosed polygon.
>>>>     
>>>>     :see: https://stackoverflow.com/a/451482 
>>>>     :param poly: (n,2)-array
>>>>     """
>>>>     # we need a plain list for the following operations
>>>>     if isinstance(poly, np.ndarray):
>>>>         poly = poly.tolist()
>>>>     segments = zip(poly, poly[1:] + [poly[0]])
>>>>     return 0.5 * abs(sum(x0*y1 - x1*y0
>>>>                          for ((x0, y0), (x1, y1)) in segments))
>>>>
>>>> Before using that function I un-close the returned contours.
>>>>
>>>> Cheers
>>>> Maik
>>>>
>>>> Am Mittwoch, 10. September 2014 11:43:59 UTC+2 schrieb Juan 
>>>> Nunez-Iglesias:
>>>>>
>>>>> Hey Maik,
>>>>>
>>>>> Can you be a bit more specific? The pipeline may need to be a bit 
>>>>> different, but this seems doable. In particular, regionprops(image)[i].area 
>>>>> will return the area of all binary-labeled regions.
>>>>>
>>>>> If that doesn’t help, if you have an example image with code it might 
>>>>> be easier to translate your workflow.
>>>>>
>>>>> Note that we don’t attempt to offer feature parity with OpenCV, which 
>>>>> has a lot of hard computer vision algorithms that we lack. But this in 
>>>>> particular should be doable.
>>>>>
>>>>> Juan.
>>>>>>>>>> Sent from Mailbox <https://www.dropbox.com/mailbox> 
>>>>>
>>>>>
>>>>> On Wed, Sep 10, 2014 at 7:40 PM, Maik Riechert <maik.r... at arcor.de> 
>>>>> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I'm currently switching from OpenCV to scikit-image and came to a 
>>>>>> point where I miss a certain feature.
>>>>>>
>>>>>> In OpenCV I used findContours() and then contourArea() to calculate 
>>>>>> the area of each contour. I couldn't find this in scikit-image. If I didn't 
>>>>>> miss it somewhere, could that be added as a new function?
>>>>>>
>>>>>> Thanks
>>>>>> Maik
>>>>>>  
>>>>>> -- 
>>>>>> 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/d/optout.
>>>>>>
>>>>>  
>>>>>   -- 
>>>> 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/d/optout.
>>>>
>>>  
>>>   -- 
>> 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/d/optout.
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scikit-image/attachments/20140910/a8ce9a3c/attachment.html>


More information about the scikit-image mailing list