DMelt:Image/1 Image Manipulation
Image manipulation using Java scripting
Viewing an image
Run this code to display an image file:
from jhplot import * IView("a.png")
This tool is designed for image viewing, without editing option.
Grabbing image data
Images can be manipulated with DataMelt using several ways. Try to open an image using the ImageJ editor as [Tools]->[ImageJ]. Using the ImageJ GUI, open any file. Once opened, you can access ImageJ Java classes using the Jython shell. Assuming that an image is displayed, access this image using JythonShell as:
>>> from ij import * >>> imp = IJ.getImage()
This creates "imp" object of an image (ImagePlus). In fact, you do not need any GUI: one can open an image using Jython scrips as:
from ij import * imp = IJ.openImage("http://jwork.org/dmelt/logo_dmelt.png") # grab an image from URL or a file imp.show() # display it in a new window
The following methods can be used to access information on image:
pixels = imp.getProcessor().getPixels() # get array of bytes width = imp.getWidth() # get width (in Nr pixels) high=imp.getHight() # get height r = imp.getProcessor().getRoi() # java.awt.Rectangle of this image
Getting pixel arrays and getting the image back
from ij import * from ij.process import * imp = IJ.openImage("http://jwork.org/dmelt/logo_dmelt.png") pix = imp.getProcessor().convertToRGB().getPixels() # RGB version of this image as a ColorProcessor print pix
The one-dimensional array has the length equal to width time hight, i.e. it is equal to
ColorProcessors return the pixel array as an int. The values of the three color components (integer values 0-255) are packed into one int variable. They can be accessed as follows:
red = (pix[i] & 0xff0000)>>16 green = (pix[i] & 0x00ff00)>>8 blue = (pix[i] & 0x0000ff)
Here red,green,blue have values from 0 - 255. If you know (red,green,blue), then you can generate a new arrays as:
pix[i]= ((red & 0xff)<<16)+((green & 0xff)<<8) + (blue & 0xff)
Let us print (red,green,color) of the current image:
w=imp.getWidth() h=imp.getHeight() for i in range(h): offset = i*w for j in range(w): c=pixRB[offset+j] red = (c & 0xff0000)>>16 green = (c & 0x00ff00)>>8 blue = (c & 0x0000ff) print red,green,blue
You can use a useful class jhplot.utils.ColorPixel which performs conversions between pixel colors and the usual RGB integer values (0-255).
The image can be created again from the array "pix" as:
img1=ImagePlus("New image", ColorProcessor(imp.width, imp.height, pix)) img1.show()
Similarly, pixels can be extracted using 32-bit float version of this image as a FloatProcessor. In this case the image will be converted to gray color representation using the formula g=(r+g+b)/3 and returns it as a float.
from ij import * from ij.process import * imp = IJ.openImage("http://jwork.org/dmelt/logo_dmelt.png") pix = imp.getProcessor().convertToFloat().getPixels() # Graystyle image using 32-bit float representation img1=ImagePlus("New image from pixels", FloatProcessor(imp.width, imp.height, pix, None)) img1.show()
Analysis and manipulation using Jython scripting will be discussed below.ere we will show how to create a random image using Jython
from ij import * from ij.process import * from java.util import Random imp = IJ.createImage("A Random Image", "8-bit", 200, 200, 1) Random().nextBytes(imp.getProcessor().getPixels()) imp.show()
This will show a frame 200x200 with an image containing random points. The API of ImageJ (and this is what is used by DataMelt) is very powerful for performing a detailed analysis of images, transformation and manipulation.
As example of the above methods, below we show how to make histograms of image colors, extracting a vector with pixel colors, converting it to 3 arrays for red, green and blue and building histograms using DataMelt API. To speed-up the code, we use jhplot.utils.ColorPixel which converts ImageJ pixel colors into the usual 3 integer RGB values (0-255). This class also helps integrate image manipulation methods into the API of dmelt.
|Protected code example! Request membership or login to this member link first.|
The output shows frequencies of each color in form of histograms (axis range is 0-255).
One can use many statistical methods to study the image as described in section DMelt:Statistics/1_General_Topics. For example, print all statistical characteristics for each color as:
print rgb.getStatString() # print detailed characteristics for red print rgb.getStatString() # print detailed characteristics for blue print rgb.getStatString() # print detailed characteristics for green
|See DMelt image examples|