Hi,
I have written a simple image viewing tool with window/level controls
linked to the right mouse, which generally works okay.
But when I use the pan/zoom button, clicking and dragging the right
mouse button changes the zoom as intended, but also affects the
window/level too which is undesirable.
How to change the callback so that the pan/zoom mode doesn't affect
window/level?
The code is attached.
If there are better image viewing tools using matplotlib, I can upgrade,
but I couldn't find them on a quick search. The goal is to add some
plotting capability ( plot row, col on user-specified coordinates) and
some ROI drawing capability. ( See my other post for those questions. )
Matplotlib: 0.87.7, python: 2.5 ubuntu 7.04
Thanks,
Venkat.
#!/usr/bin/env python
import scipy
import pylab
from pylab import cos, sqrt, arctan2, sqrt,pi,cm, clim, get_current_fig_manager
import sys
# Displaying an image with window/level controls
# from matplotlib
pylab.ion()
xstart = 0;
ystart = 0;
win = 0;
lev = 0;
vmax_orig = 0;
vmin_orig = 0;
def on_click(event):
#get the x and y coords, flip y from top to bottom
global win,lev
win = im.norm.vmax - im.norm.vmin;
lev = (im.norm.vmax + im.norm.vmin)/2;
x, y = event.x, event.y;
if event.button==3:
if event.inaxes is not None:
global xstart,ystart
xstart = event.xdata;
ystart = event.ydata;
#print 'click:data coords', event.xdata, event.ydata;
def on_move(event):
#get the x and y pixel coords
x, y = event.x, event.y
scale = 10;
if event.button==3:
if event.inaxes is not None:
xdelta = event.xdata - xstart;
ydelta = event.ydata - ystart;
xratio = xdelta / (im.get_extent()[1]-im.get_extent()[0]);
yratio = ydelta / (im.get_extent()[3]-im.get_extent()[2]);
new_win = xratio*scale + win;
new_lev = yratio*scale + lev;
if new_win < 0: new_win = 0;
clim_high = new_lev + new_win/2;
clim_low = new_lev - new_win/2;
clim(clim_low,clim_high);
#print 'move:deltas', xdelta, ydelta
#print 'clim_low: ', clim_low, 'clim_high: ', clim_high
def on_release(event):
global win,lev
x, y = event.x, event.y
if event.button==2:
if event.inaxes is not None:
clim(vmin_orig,vmax_orig);
print 'release: vmin: ',im.norm.vmin,'vmax: ',im.norm.vmax
def viewimage(imdata):
global im,vmax_orig,vmin_orig
im=pylab.imshow(imdata,origin='lower',cmap=cm.gray);
vmax_orig = im.norm.vmax;
vmin_orig = im.norm.vmin;
binding_id = pylab.connect('motion_notify_event', on_move)
pylab.connect('button_press_event', on_click)
pylab.connect('button_release_event', on_release)
pylab.show();
def main():
# Creating the grid of coordinates x,y
x,y = scipy.ogrid[-1.:1.:.01, -1.:1.:.01]
z = 3*y*(3*x**2-y**2)/4 + .5*cos(6*pi * sqrt(x**2 +y**2) + arctan2(x,y))
viewimage(z);
if __name__ == '__main__':
main()
-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users