From: Gillian W. <gil...@at...> - 2003-07-17 18:33:44
|
Hi, I think this could evolve into two separate tutorials- one for the python shell, and one for the plug-in (tools) mechanism, since they are independent. Perhaps they could fall as sections under the existing pyshell.html and customization.html, but be referenced from the top level openev help page as sub-sections so it looks like: OpenEV Online Help Pages * View Area Button/Key Sequences <cid:par...@at...> * Layers Management Dialog <cid:par...@at...> * Raster Properties Dialog <cid:par...@at...> * Vector Properties Dialog <cid:par...@at...> * Point Query Properties Dialog <cid:par...@at...> * Printing Dialog <cid:par...@at...> * Editing Toolbar <cid:par...@at...> * Interactive Python Shell <cid:par...@at...> o Tutorial <cid:par...@at...> * Main Window <cid:par...@at...> * Open 3D View <cid:par...@at...> * Application Preferences <cid:par...@at...> * File Access <cid:par...@at...> * Performance Tuning <cid:par...@at...> * Customization <cid:par...@at...> o Tutorial <cid:par...@at...> Or, OpenEV Online Help Pages * View Area Button/Key Sequences <cid:par...@at...> * Layers Management Dialog <cid:par...@at...> * Raster Properties Dialog <cid:par...@at...> * Vector Properties Dialog <cid:par...@at...> * Point Query Properties Dialog <cid:par...@at...> * Printing Dialog <cid:par...@at...> * Editing Toolbar <cid:par...@at...> * Interactive Python Shell <cid:par...@at...> * Main Window <cid:par...@at...> * Open 3D View <cid:par...@at...> * Application Preferences <cid:par...@at...> * File Access <cid:par...@at...> * Performance Tuning <cid:par...@at...> * Customization <cid:par...@at...> Tutorials * Using the python shell <cid:par...@at...> * Creating a new Plug-in <cid:par...@at...> What do you think? I'm updating customization.html and pyshell.html at the moment, so I could combine the changes if either of these seems like a sensible approach to others. I like your FFT examples, by the way- they're simpler and more sensible examples than the ones I put in customization html. Gillian Andrey Kiselev wrote: >Hello, > >I'm working on OpenEV customizing tutorial and now I have preliminary >version. It is not complete document yet, but more a skeleton. I'm >posting it now to get a comments and suggestions what topics should be >covered in such manual. > > Regards, > Andrey > > > > > ------------------------------------------------------------------------ > > > OpenEV Python Interface Tutorial > > This is a short tutorial intended to get you the first view on > utilising GDAL's and OpenEV's Python interface in your applications. > There are two parts in this document: interactive Python usage in > OpenEV for image processing and writing custom Python modules to > extend OpenEV's capabilities. > > OpenEV is interactive applications, so we will investigate, how to > adopt it for your needs using Python shell and by writing additional > plug-ins, available through the GUI. If your purpose is writing > non-interactive scripts, you don't need OpenEV's Python level, GDAL > level will be enough for you. > > To work with this tutorial you need some level of knowledge in Python > and Numeric (extension provides efficient interface for operation with > large arrays in Python). > > > Using Python shell > > We are starting with Python shell (Edit-<Python Shell... menu item). > You should load some raster file into OpenEV to work with. > > * Get active layer > >layer = gview.app.sel_manager.get_active_layer() > > > ...and load data array into memory: > >ds = layer.get_parent().get_dataset() >data = DatasetReadAsArray(ds) > > > If you don't want open and display you input data with OpenEV, > but want load the file(s) in memory, make some calculations and > display result, you can use other approach instead of previous > steps: > >data = LoadFile('filename.l1b') > > > (In this sample we will work with NOAA AVHRR data in L1B format). > > * Now we are ready to operate with loaded data. For example, > calculate normalised difference vegetation index (NDVI) with > NOAA AVHRR data. In this case NDVI is calculated as (Band2 - > Band1)/(Band2 + Band1). We assume we have already calibrated > data in our file. > >ndvi = (data[1] - data[0]) / (data[1] + data[0]) > > > * Display result and, optionally, save it into file: > >display(ndvi) >SaveArray(ndvi,'ndvi.tif','GTiff') > > > Note, that in all our computations arrays are fully loaded into > memory. Be sure you have enough resources for this. For large > arrays loading and calculations may take some time. > > * Another operation: let's make a RGB composite image. In general > case this operation should be interactively controlled by the > user, because band colors should be carefully adjusted to > produce the best looking results. But we will simplify our task. > NOAA AVHRR data has 10-bit depth (GDAL stores them in 16-bit > integer), so we just scale input data to 8-bit and fill > three-component array. > >rgb = zeros((3, ds.RasterYSize, ds.RasterXSize), UnsignedInt8) >for i in range(3): > rgb[i] = (data[i] * 256 / 1024).astype(UnsignedInt8) >display(rgb) > > > This code produces a RGB composite from the first three channels > of the input image, but you can unroll the loop and use channels > you want. Following code uses channel 5 as red, 2 as green and 3 > as blue: > >rgb[0] = (data[4] * 256 / 1024).astype(UnsignedInt8) >rgb[1] = (data[1] * 256 / 1024).astype(UnsignedInt8) >rgb[2] = (data[3] * 256 / 1024).astype(UnsignedInt8) > > > * Now we will use other data as a sample. Let load ASTER Level 1B > dataset (the second band) and try to calibrate it. This dataset > already reprocessed and should be calibrated with the simple > linear function. Function coefficients contained in the metadata > records with the appropriate number at the end (2 in case of the > second band). > >layer = gview.app.sel_manager.get_active_layer() >ds = layer.get_parent().get_dataset() >data = DatasetReadAsArray(ds) >incl = float(ds.GetMetadata()["INCL2"]) >offset = float(ds.GetMetadata()["OFFSET2"]) >data_cal = data * incl + offset >display(data_cal) > > > > Writing OpenEV plug-ins > > To be able writing comprehensive OpenEV GUI plug-in you should be > familiar with the GTK+ programming using Python (PyGTK). > > OpenEV modules should be placed in the /pymod// or /tools// > subdirectories to be loaded automatically. > > We will write simple GUI module to automate Fast Fourier Transform > task. As a first attempt we make a menu item to perform FFT. > ># OpenEV module fft.py > >from gtk import * > >import gview >import GtkExtra >import gviewapp >import gdalnumeric >import FFT > >class FFTTool(gviewapp.Tool_GViewApp): > > def __init__(self,app=None): > gviewapp.Tool_GViewApp.__init__(self,app) > self.init_menu() > > def init_menu(self): > self.menu_entries.set_entry("Image processing/FFT",2,self.calculate_fft) > > def calculate_fft(self,*args): > layer = gview.app.sel_manager.get_active_layer() > ds = layer.get_parent().get_dataset() > data = gdalnumeric.DatasetReadAsArray(ds) > data_tr = FFT.fft2d(data) > array_name = gdalnumeric.GetArrayFilename(data_tr) > gview.app.file_open_by_name(array_name) > >TOOL_LIST = ['FFTTool'] > > > This module adds a new top level menu "Image processing" with single > item "FFT". Save this text into file, place it into /tools// and > restart OpenEV. Load an image, and click on the new menu item. > Transformed image appears as a new layer (you may need click on "Fit > All Layers" button to see it). > > Note, that you can easily extend functionality of the OpenEV with such > approach. You can write scripts for most often performed tasks (like > calibration or NDVI calculation, described in previous section) and > place them into menu or taskbar. > > Ok, our simplest script works, but now we will go further and make a > dialog box to allow user select what type of transformation (forward > or inverse) we should perform and where to place results (in new layer > of the same view or create the new view and place results there). > ># OpenEV module fft2.py > >from gtk import * > >import gview >import GtkExtra >import gviewapp >import gdalnumeric >import FFT > >class FFT2Tool(gviewapp.Tool_GViewApp): > > def __init__(self,app=None): > gviewapp.Tool_GViewApp.__init__(self,app) > self.init_menu() > > def launch_dialog(self,*args): > self.win = FFTDialog() > self.win.show() > > def init_menu(self): > self.menu_entries.set_entry("Image processing/FFT2",2,self.launch_dialog) > >class FFTDialog(GtkWindow): > > def __init__(self,app=None): > GtkWindow.__init__(self) > self.set_title('Fast Fourier Transform') > self.create_gui() > self.show() > > def show(self): > GtkWindow.show_all(self) > > def close(self, *args): > self.hide() > self.visibility_flag = 0 > return TRUE > > def create_gui(self): > self.box1 = GtkVBox(spacing = 10) > self.box1.set_border_width(10) > self.add(self.box1) > self.box1.show() > > self.switch_forward = GtkRadioButton(None, "Forward") > self.box1.pack_start(self.switch_forward) > self.switch_forward.show() > self.switch_inverse = GtkRadioButton(self.switch_forward, "Inverse") > self.box1.pack_start(self.switch_inverse) > self.switch_inverse.show() > > self.separator = GtkHSeparator() > self.box1.pack_start(self.separator, expand=FALSE) > > self.switch_new_view = GtkCheckButton("Create new view") > self.box1.pack_start(self.switch_new_view) > self.switch_new_view.show() > > self.separator = GtkHSeparator() > self.box1.pack_start(self.separator, expand=FALSE) > > self.box2 = GtkHBox(spacing=10) > self.box1.pack_start(self.box2, expand=FALSE) > self.box2.show() > > self.execute_btn = GtkButton("Ok") > self.execute_btn.connect("clicked", self.execute_cb) > self.box2.pack_start(self.execute_btn) > self.execute_btn.set_flags(CAN_DEFAULT) > self.execute_btn.grab_default() > > self.close_btn = GtkButton("Cancel") > self.close_btn.connect("clicked", self.close) > self.box2.pack_start(self.close_btn) > > def execute_cb( self, *args ): > layer = gview.app.sel_manager.get_active_layer() > ds = layer.get_parent().get_dataset() > data = gdalnumeric.DatasetReadAsArray(ds) > > if self.switch_forward.get_active(): > data_tr = FFT.fft2d(data) > else: > data_tr = FFT.inverse_fft2d(data) > array_name = gdalnumeric.GetArrayFilename(data_tr) > > if self.switch_new_view.get_active(): > gview.app.new_view() > gview.app.file_open_by_name(array_name) > else: > gview.app.file_open_by_name(array_name) > >TOOL_LIST = ['FFT2Tool'] > > > As you can see the most laborious part of the work is creating GUI > controls. > |