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

Reply via email to