How to draw a region of interest

Hi:

Just stared playing with matplotlib, I want to draw a polygon on top of an image to select a region of interest in the image.
Does anybody have any example or advice on how to interactively draw a polygon with the mouse by placing it's vertices's one click at a time ?
Another case that I have would be just to fill a region with a thick line, searched for a "doodle example" or a "paint example" but could not find them, any advice would be appreciated too.

                                                                      Daniel.

Look in at the widget examples. There is a new Lasso widget for
"doodling" and a RectangleSelector.

- Charlie

···

On 8/4/06, Daniel Kornhauser <kornhauser@...1209...> wrote:

Hi:

Just stared playing with matplotlib, I want to draw a polygon on top of
an image to select a region of interest in the image.
Does anybody have any example or advice on how to interactively draw a
polygon with the mouse by placing it's vertices's one click at a time ?
Another case that I have would be just to fill a region with a thick
line, searched for a "doodle example" or a "paint example" but could not
find them, any advice would be appreciated too.

Hey guys:

Charlie I did not find your lasso example so I cooked up mine, I attach it.
Can you give me the file name that contains the new Lasso widget for "doodling" ?

This is just the start of the lasso or "region of interest" widget I still have to :
    - fill the region with a color
    - make it work with layers
    - add methods that return the pixel region or the contour coordinates
    - make a nice class

If anybody has made such a widget I would love to see the code, I hate reinventing the wheel.

If there is not such an example such as the lasso tool, can my example be added to the examples ?
What is the process ?

Anyway, I can't believe there is not such a widget, I thought there must be some people that use matplotlib for Digital Image Processing ?
Isn't there ?

Any critique on my code would be appreciated, I have never programed with matplotlib ...

                                                                   Daniel.

Charlie Moad wrote:

region_of_interest.py (3.22 KB)

···

On 8/4/06, Daniel Kornhauser <kornhauser@...1209...> wrote:

Hi:

Just stared playing with matplotlib, I want to draw a polygon on top of
an image to select a region of interest in the image.
Does anybody have any example or advice on how to interactively draw a
polygon with the mouse by placing it's vertices's one click at a time ?
Another case that I have would be just to fill a region with a thick
line, searched for a "doodle example" or a "paint example" but could not
find them, any advice would be appreciated too.

Look in at the widget examples. There is a new Lasso widget for
"doodling" and a RectangleSelector.

- Charlie

from matplotlib.widgets import Lasso
It might not of made the last release.
http://svn.sourceforge.net/viewvc/matplotlib/trunk/matplotlib/lib/matplotlib/widgets.py?revision=2583&view=markup

···

On 8/7/06, Daniel Kornhauser <kornhauser@...1209...> wrote:

Hey guys:

Charlie I did not find your lasso example so I cooked up mine, I attach it.
Can you give me the file name that contains the new Lasso widget for
"doodling" ?

This is just the start of the lasso or "region of interest" widget I
still have to :
    - fill the region with a color
    - make it work with layers
    - add methods that return the pixel region or the contour coordinates
    - make a nice class

If anybody has made such a widget I would love to see the code, I hate
reinventing the wheel.

If there is not such an example such as the lasso tool, can my example
be added to the examples ?
What is the process ?

Anyway, I can't believe there is not such a widget, I thought there must
be some people that use matplotlib for Digital Image Processing ?
Isn't there ?

Any critique on my code would be appreciated, I have never programed
with matplotlib ...

                                                                   Daniel.

Charlie Moad wrote:
> On 8/4/06, Daniel Kornhauser <kornhauser@...1209...> wrote:
>> Hi:
>>
>> Just stared playing with matplotlib, I want to draw a polygon on top of
>> an image to select a region of interest in the image.
>> Does anybody have any example or advice on how to interactively draw a
>> polygon with the mouse by placing it's vertices's one click at a time ?
>> Another case that I have would be just to fill a region with a thick
>> line, searched for a "doodle example" or a "paint example" but could not
>> find them, any advice would be appreciated too.
>
> Look in at the widget examples. There is a new Lasso widget for
> "doodling" and a RectangleSelector.
>
> - Charlie

#!/usr/bin/env python
"""
This example shows how to use matplotlib to create regions of interest.
I has two modes:
     - the segment mode, each time you click the mouse you can create a line segment
     - the free hand mode, by keeping pressed the right button you can create a iregular contour
The right button closes the loop.
Daniel Kornhauser
"""
from pylab import *

class ROI:

    def __init__(self, ax, fig):
        self.previous_point = []
        self.start_point = []
        self.end_point = []
        self.line = None

        self.fig = fig
        self.fig.canvas.draw()

    def motion_notify_callback(self, event):
        if event.inaxes:
            ax = event.inaxes
            x, y = event.xdata, event.ydata
            if event.button == None and self.line != None: # Move line around
                self.line.set_data([self.previous_point[0], x],
                                   [self.previous_point[1], y])
                self.fig.canvas.draw()
            elif event.button == 1: # Free Hand Drawing
                    line = Line2D([self.previous_point[0], x],
                                  [self.previous_point[1], y])
                    ax.add_line(line)
                    self.previous_point = [x, y]
                    self.fig.canvas.draw()

    def button_press_callback(self, event):
        if event.inaxes:
            x, y = event.xdata, event.ydata
            ax = event.inaxes
            if event.button == 1: # If you press the right button
                    if self.line == None: # if there is no line, create a line
                        self.line = Line2D([x, x],
                                           [y, y],
                                           marker = 'o')
                        self.start_point = [x,y]
                        self.previous_point = self.start_point
                        ax.add_line(self.line)
                        self.fig.canvas.draw()
                    # add a segment
                    else: # if there is a line, create a segment
                        self.line = Line2D([self.previous_point[0], x],
                                           [self.previous_point[1], y],
                                           marker = 'o')
                        self.previous_point = [x,y]
                        event.inaxes.add_line(self.line)
                        self.fig.canvas.draw()

            elif event.button == 3 and self.line != None: # close the loop
                        self.line.set_data([self.previous_point[0], self.start_point[0]],
                                           [self.previous_point[1], self.start_point[1]])
                        ax.add_line(self.line)
                        self.fig.canvas.draw()
                        self.line = None

def main():
    fig = figure()
    ax = fig.add_subplot(111)
    ax.set_title(" left click: line segment left pressed: doodle right click: close region")
    cursor = ROI(ax, fig)
    fig.canvas.mpl_connect('motion_notify_event', cursor.motion_notify_callback)
    fig.canvas.mpl_connect('button_press_event', cursor.button_press_callback)
    show()

if __name__ == "__main__":
    main()

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users