Title: EE2E1. JAVA Programming
1ImageJ
EE4H, M.Sc 0407191 Computer Vision Dr. Mike
Spann m.spann_at_bham.ac.uk http//www.eee.bham.ac.uk
/spannm
2Contents
- About ImageJ
- Image representation in ImageJ
- Displaying images in ImageJ
- ImageJ utility class
- Regions of interest
- Writing plug-ins
3About ImageJ
- All of this material is taken from the ImageJ
tutorial accessed from my web-site - http//mtd.fh-hagenberg.at/depot/imaging/imagej/
- Also check out the ImageJ home page
- http//rsb.info.nih.gov/ij/
- ImageJ is a free image processing system allowing
easy development of Java based image processing
algorithms in the form of plug-ins
4About ImageJ
- It comes with a user-friendly GUI and can run
either as an application or an applet - http//rsb.info.nih.gov/ij/applet/
5About ImageJ
- It can handle 8,16,24 and 32 bit images
- It can handle most standard image formats
- TIFF
- GIF
- JPEG
- BMP
- DICOM
- It can handle stacks of images
- Also there are plug-ins allowing it to handle
movie files - It can also handle regions of interest (ROIs)
6About ImageJ
- The key point about ImageJ is that it is simple
to add your own algorithms (written as plug-ins)
callable from the front-end GUI - File I/O taken care of by ImageJ
- Pixel access easy from image handles defined
within ImageJ
7Image representation in ImageJ
- ImageJ has 5 built-in image classes
- 8 bit grayscale (byte)
- 8 bit colour (byte)
- 16 bit grayscale (short)
- RGB colour (int)
- 32 bit image (float)
- It also supports image stacks consisting of
images (slices) of the same size
8Image representation in ImageJ
- ImageJ uses 2 classes to represent and manipulate
images - ImagePlus
- An image is represented by an ImagePlus object
- ImageProcessor
- This holds the pixel data and contains methods to
access the pixel data
9Image representation in ImageJ
- Pixel access methods in ImageProcessor include
- Object getPixels() returns a reference to the
pixel array (need to cast to appropriate type) - int getHeight() returns height of pixel array
- int getWidth() returns width of pixel array
10Image representation in ImageJ
- A subclass of ImageProcessor is passed to the
run() method of the plug-in filter (see later) - ByteProcessor - 8 bit grayscale images
- ShortProcessor 16 bit grayscale images
- ColorProcessor RGB images
- FloatProcessor 32 bit floating point images
11Image representation in ImageJ
- Pixel representation in ImageJ uses the byte
datatype for grayscale and colour images and
short for 16-bit grayscale - byte/short are signed data types
- byte ranges from 128 to 127
- short ranges from 32768 to 32767
- Obviously grayscale values are usually positive
values
12Image representation in ImageJ
- To cast a byte to an integer, we need to
eliminate the sign bit - Can cast back the other way easily enough
byte pixels(byte) ip.getPixels() int
grey0xxff pixelsj
pixelsj(byte) grey
13Image representation in ImageJ
- The ColorProcessor return the pixels as int and
the RGB values are packed into the one int
variable
0 bit
31
int pixels(int) ip.getPixels() int
red(0xxff0000 pixelsj) gtgt 16 int
green(0xx00ff00 pixelsj) gtgt 8 int
blue(0xx0000ff pixelsj)
14Image representation in ImageJ
- Can reconstitute an RGB array by shifting the
other way
pixelsj((red 0xff)ltlt16)((green
0xff)ltlt8)(blue 0xff)
15Displaying images in ImageJ
- A class ImageWindow is used to display ImagePlus
objects - We dont normally need to access methods of
ImageWindow - These are automatically called from ImagePlus
methods show(), draw() and updateAndDraw()
16ImageJ utility class
- ImageJ contains a class called IJ which contains
a number of useful static methods - Error messages
- static void error(String message) displays an
error message in a dialog box - static boolean showMessageWithCancel(String
title, String message) allows the user to
cancel the plug in or continue
17ImageJ utility class
- Displaying text
- static void write(String s) - Outputs text in a
window useful for displaying textual or
numerical results of algorithms - Displaying text in a status bar
- static void showStatus(String s)
18ImageJ utility class
- User input
- static double getNumber(String prompt, double
default) Allows the user to input a number in a
dialog box - static String getString(String prompt, String
default) Allows the user to input a string in a
dialog box - The GenericDialog class is a more sophisticated
way of inputting more than a single number or
string
19Regions of interest (ROIs)
- A plug in filter does not always have to work on
the whole image - ImageJ supports ROIs which can are usually
rectangular but can be other shapes as well. - We set/get the ROI using the following method of
the ImageProcessor class - void setROI(int x, int y, int w int h)
- Rectangle getROI()
20Writing plug-ins
- To write a plug in requires developing a class
which implements either the PlugIn or
PlugInFilter interfaces - The second is more usual as this is used when the
filter requires an input image
import ij. import ij.plugin.filter.PlugInFilter
import ij.process class myPlugin implements
PlugInFilter
21Writing plug-ins
- Methods setup() and run() must then be provided
- Method setup() sets up the plugin filter for use
- String arg allows input arguments to be passed to
the plugin - Argument imp handled automatically by ImageJ
- Its the currently active image
int setup(String arg, ImagePlus imp)
22Writing plug-ins
- Method setup() returns a flag word representing
the capabilities of the plug-in filter (for
example the types of images it can handle). For
example - static int DOES_8G
- static int DOES_RGB
- static int DOES_ALL
- static int NO_CHANGES (plug in doesnt change the
image data) - static int ROI_REQUIRED
- etc
23Writing plug-ins
- The run() method is called when the plugin is run
from the ImageJ menu - It contains the code to process individual pixels
- If no input image is required
- If an input image is required
void run(String arg)
void run(ImageProcessor ip)
24Writing plug-ins
- Once the Java program is written and compiled,
the .class file is stored in the plug-in
directory which is a sub-directory of the ImageJ
home directory - The class name should contain an underscore
symbol (eg MyAlgorithm_ ) - It then appears under the plug-in sub-menu of the
ImageJ gui
25Conclusions
- ImageJ is a useful and flexible environment for
developing Java-based image processing algorithms - User algorithms can be simply added to a GUI
using the concept of a plug-in - ImageJ allows easy access to image pixel data for
a range of image types