package com.c3d.image;
Abstract method of comparing images. No constraint as to how this is done, only that it imposes a distance metric on images.
public interface ImageComparator{ public double difference(Jimage a, Jimage b); }
package com.c3d.image; import com.c3d.structured.*; import com.c3d.operators.*; import com.c3d.util.atomic.*; //import com.c3d.Kparser.*; import java.awt.*; import java.awt.image.*; import java.util.*; import java.io.*; import java.awt.Toolkit; // // // Jimage // //
The class Jimage1 is an abstract class to support image processing operations. It also implements the java.awt ImageConsumer class enabling it to be loaded with image data from the java system.
If Jimages are to be displayed, one obtains a statdard awt ImageProducer from the Jimage useing the getProducer method. This can then be used to construct images that can be displayed in java awt windows.
unsigned | bytes | shorts | float | |
min value | 0 | -128 | -2048 | 0 |
maxval | 255 | 127 | 20477 | 1 |
medianval m | 127.5 | -0.5 | -0.5 | 0 |
range r | 255 | 255 | 255 | 1 |
As shown in table a pixel prin representation r is converted to a pixel Ps in representation s by the operation:
|
public abstract class Jimage implements Subscriptable,ImageConsumer ,Struct,Universal { static final int alphamask =0xff000000;lowest value of an unsigned pixel
public static final int umin =0; static final int bmin =-128; public static final int smin = -2048; public static final float fmin =-1; static final int umax = 255; static final int bmax = 127; public static final int smax = 2047; static final int shortshift =11; public static final float fmax= 1;unsigned byte pixel range
public static final int urho = umax-umin+1;signed byte pixel range
public static final int brho = bmax-bmin+1;signed short pixel range
public static final int srho = smax-smin+1; public static final float frho = fmax-fmin;unsigned byte pixel median
static final float umu = (float)0.5*(urho)+umin;byte median
static final float bmu = (float)0.5*(brho)+bmin;short median
static final float smu = (float)0.5*(srho)+smin;float median
public static final float fmu = (float)0.5*(frho)+fmin;required by image consumer but not used
public int hints; public ColorModel colorModel=ColorModel.getRGBdefault();The number of pixels high and wide that the image occupies.
public int height,width,planes; //public Hashtable properties= new Hashtable();convert float pixel to byte pixel
static float frhorecip = 1/frho; public static byte fpixelTobpixel(float fpixel)convert a 12 bit short pixel to a signed byte
public static final byte spixelTobpixel(short s) /* convert a signed byte to a 12 bit short */ public static final short bpixelTospixel(short b) public static int bpixelToupixel(byte b) public static byte upixelTobpixel(int upixel)convert short pixel from unsigned
public static short upixelTospixel(int upixel) static final float stouscale =((float)urho)/srho;convert short pixel to unsigned
public static int spixelToupixel(int spixel) static final float utofscale = frho/urho; public static float upixelTofpixel(int upixel) static final float btofscale = frho/brho; public static float bpixelTofpixel(byte bpixel)
|
public static short fpixelTospixel(float fpixel) public static float spixelTofpixel(int spixel) public static int fpixelToupixel(float fpixel)convert short pixel to float pixel
static final float stofscale = frho/srho; public static float spixelTofpixel(short spixel)return i within the range of float pixels (i < fmin?fmin:(i > fmax?fmax:i))
public static float fsaturate(float i) public static float fsaturate(double i)Return i in the range of byte pixels
public static byte bsaturate(double i)Return i in the rang eof short pixels
public static short ssaturate(double i) public static int usaturate(double i) abstract Jimage getPlane(int k);Returns the pixel in the range -1 to +1.
public abstract float fpixel(int x, int y, int plane);TeX Returns the pixel in the range -128 to + 127. see fpixel for equivalent floating point value.
abstract byte bpixel(int x, int y, int plane);return signed short pixel
public abstract short spixel(int x, int y, int plane); public abstract void setPixel(int x,int y, int plane,double pix); public void setPixel(int x,int y, int plane, int p); public void setPixel(int x, int y, int plane, short p); public abstract int upixel(int x, int y, int plane);Converts the plane information into a pixel in the direct colour model of java. It has to convert from the signed form of pixels to an unsigned representation before packing into an integer. If the image is monochrome return the same brightness in all of the portions of the pixel
public int rgbpixel(int x, int y)
Images dx and dy contain the discrepancy in x and y positions from which source pixels to be obtained let r be the result, s the source then
|
public Jimage warp(Jimage dx, Jimage dy)throws CloneNotSupportedException public abstract Universal Upixel(int x,int y, int plane); public abstract Jimage convolve(double [][]kernel);convolve with symetrical seperable kernel.
public Jimage convolve (double []k) public abstract Jimage abs(); public abstract Jimage subImage(int x, int y, int dx, int dy);Update an area of an image with another one. The other one must not run off the edge of the one being written to. The source of the copying is the 0th plane of the source jimage.
public void setSubImage(int x, int y,int z, Jimage im) public Jimage sqr()first sum the planes to a grey scale image and then return the sum of the absolute values of the pixels
public float l1Norm()first sum the planes to a grey scale image and then return the sqrt of the sum of the squared values of the pixels
public float l2Norm()Return the sum of the floating point pixels in the z plane
public float sum(int z)Denote x.fmodulus() by |x|. Returns the square root of the sum of values of the pixels
public float fmodulus()This reduces all planes of the image by the operator returning a tuple of results.
/* public Subscriptable preduce(Doperator op) */The members ar the planes, so that op / i for i an image will reduce the image to one with a single plane
public Enumeration members() public static final int REDPLANE=0; public static final int GREENPLANE=1; public static final int BLUEPLANE=2; public static final int ALPHAPLANE=3; public static final int MONOCHROME=1; public static final int RGB=3; private int status=0;
|
|
|
public Jimage RGB2YUV()
|
|
|
public Jimage YUV2RGB() //private ImageProducer producer=null; public synchronized Image getAWTImage() /* Returns a awt compatible buffered image public BufferedImage getBufferedImage() */ public ImageProducer getProducer()Returns an instance of the particular sub class of images to which the parent belongs
public abstract Jimage oneOfThese(); Jimage rescale(int nwidth,int nheight ) Jimage smooth(double factor) Jimage xsmooth(double factor) Jimage ysmooth(double factor)This method allows the depth as well as area of an image to be altered if it is reduced the planes are aggregated if increased they are interpolated
public Jimage getScaledInstance(int nwidth,int nheight,int ndepth) Jimage getnewdepth(int ndepth) float aweight(float step, float d) Jimage aggregateplanes(int ndepth) Jimage interpolateplanes(int ndepth)This replicates the functionality of the get scaled instance method of the AWT image class.
public Jimage getScaledInstance(int nwidth,int nheight )Load the image from the specified file. The file must be jpeg or gif.
public synchronized boolean getImage(String fileName)Outputs the image to a jpeg file
public synchronized void putJPEGImage(String fileName, int quality) throws IOException public void setProperties(Hashtable props) public void setHints(int h) public void setColorModel(ColorModel cm) public synchronized void imageComplete(int s)Subscription by a number returns the Ith plane of the image. Subscription by a 3tuple returns the pixel at position [plane,x,y]. All other case raise an array bounds exception.
public Universal subscript(Universal I)Returns the ith plane
public Universal subscript(int i)Returns the number of planes in an image.
public int arity()Returns the number of pixels in an image
public double cardinality()one image less than another if all pixels less than corresponding ones, thus it can be implemented by injecting < between the elements of a and b, and then applying ×/ to the result
public boolean lessthan (Universal b) public Jimage shift(int i) void checksync()throws AWTExceptionMethods implementing Struct
public Numeric numberOfElements() public String toString(char c) public String toString() //public float fmodulus() public Numeric modulus() public Universal reduce(Doperator op) public int hashCode() /* public static Universal fromFile(String fn) throws FileNotFoundException,IOException,KSyntaxError */ public Universal times(double n) public Universal plus(double n) public Universal minus(double n) public Universal divide(double n) public Universal concat(Universal b) } class JimageProducer implements ImageProducer { Vector consumers = new Vector(); Hashtable properties = new Hashtable(); Jimage theImage; int pixels[]; JimageProducer(Jimage ji) public synchronized void addConsumer(ImageConsumer ic) public synchronized boolean isConsumer(ImageConsumer ic) public synchronized void removeConsumer(ImageConsumer ic) public void startProduction(ImageConsumer ic) private void produce(ImageConsumer ic) public void requestTopDownLeftRightResend(ImageConsumer ic) } class Jupit implements Enumeration{ int i; Jimage t; public boolean hasMoreElements() public Object nextElement() public Jupit(Jimage t1) }
ShortImage © Turing Institute, 1998, W P Cockshott.
A byte image is one that stores its information as a vector of shorts. This is necessary in order to handle the numeric range 0..255 in Java which does not support unsigned bytes. It is initialised by explicitly passing in the shorts.
package com.c3d.image; import com.c3d.util.atomic.*; import com.c3d.structured.*; import com.c3d.operators.*; import java.awt.image.*; public class ShortImage extends Jimage {
public short data[][];The data is stored as linear array of shorts for each plane
public int startindata;The position in the data at which the image origin ( top left ) occurs
public int scanlinelength;The number of shorts in a single scan line of the image data.
public ShortImage() boolean isleaf() public Jimage oneOfThese() public ShortImage(int plane)Creates an image of size zero with right number of planes
public ShortImage(short d[][], int dx, int dy) public ShortImage(short d[][], int dx, int dy, int linewidth, int start)Create an image sharing the data with size dx, dy at offset start *
public ShortImage(int x, int y, int z) public Universal concat(Universal a) public Jimage subImage(int x, int y, int dx, int dy)
public void setDimensions(int w, int h) protected Object clone() throws CloneNotSupportedException public Jimage abs() public void setPixel(int x, int y, int z, double p) public float sum(int z) public void setPixel(int x,int y, int z, short p) public void setPixel(int x, int y, int z, int p) public synchronized void setPixels(int srcX, int srcY, int srcW, int srcH, ColorModel cm, byte pixels[], int srcOff, int srcScan) public synchronized void setPixels(int srcX, int srcY, int srcW, int srcH, ColorModel cm, int pixels[], int srcOff, int srcScan)fSubscription by a scalar returns the appropriate pixel in the 0th plane of the image, allowing for the offset of this image from the start of the image data.
public float fsubscript(int I);
public Universal Inject(Universal b,Doperator op)combine two structured classes under a dydaic operator
public Universal minus(Universal b)
When a numeric is subtracted from a Jimage, the result is formed by explicit subtraction, otherwise, operator injection is used.
public Universal plus (Universal b)implements +
When a numeric is added to a Jimage, the result is formed by addition explicitly, otherwise, operator injection is used.
public short[][] newData() public Universal times (Universal b)implements ×
public Universal divide (Universal b)implements ¸
int pa(int x,int y)Calculates pixel address, checking bounds.
public float fpixel(int x, int y , int plane)
|
public int upixel(int x, int y, int plane) public short spixel(int x, int y , int plane) public int rgbpixel(int x, int y)Converts the plane information into a pixel in the direct colour model of java. It has to convert from the signed form of pixels to an unsigned representation before packing into an integer.
Convert a pixel in the range 0-255 to one in the range -128 to 127.
public byte bpixel(int x, int y, int plane) public Universal Upixel(int x, int y, int plane) public Jimage convolve(double [][]kernel) public Universal Map(Moperator op) public Jimage getPlane(int k) }
package com.c3d.image; import com.c3d.structured.*; import com.c3d.util.atomic.*; import com.c3d.operators.*; import java.awt.image.*; import java.awt.*; // // // FloatImage // //
FloatImage © Turing Institute, 1998, W P Cockshott.
A float image is one that stores its information as a vector of floats. It is initialised by explicitly passing in either bytes or floats.
public class FloatImage extends Jimage {
The data is stored as linear array of bytes for each plane
public float data[][];The position in the data at which the image origin ( top left ) occurs
public int startindata;The number of floats in a single scan line of the image data.
public int scanlinelength;returns true if it is a region of interest of a larger image
public boolean isROI()
public FloatImage() public Jimage getPlane(int k)Creates an image of size zero with right number of planes
public FloatImage(int plane) public Jimage oneOfThese() public FloatImage(float d[][], int dx, int dy) public FloatImage(byte d[][], int dx, int dy)Create an image sharing the data with size dx, dy at offset start *
private FloatImage(float d[][], int dx, int dy, int linewidth, int start) public Universal concat(Universal a) public Jimage subImage(int x, int y, int dx, int dy)compute sum of abs values of the image
public float fmodulus() public synchronized void setDimensions(int w, int h) public Universal Map(Moperator o) public void setPixel(int x, int y, int z, double p) public synchronized void setPixels(int srcX, int srcY, int srcW, int srcH, ColorModel cm, byte pixels[], int srcOff, int srcScan) public synchronized void setPixels(int srcX, int srcY, int srcW, int srcH, ColorModel cm, int pixels[], int srcOff, int srcScan)
public float fsubscript(int I);combine two structured classes under a dydaic operator
public Universal Inject(Universal b,Doperator op)
When a numeric is subtracted from a Jimage, the result is formed by explicit subtraction, otherwise, operator injection is used.
public Universal minus(Universal b)implements + When a numeric is added to a Jimage, the result is formed by addition explicitly, otherwise, operator injection is used.
public Universal plus (Universal b)implements ×
public Universal times (Universal b)implements ¸
public Universal divide (Universal b) public Jimage abs()Calculates pixel address, checking bounds.
int pa(int x,int y) public float sum(int z)
|
public byte bpixel(int x, int y , int plane) public short spixel(int x, int y, int plane) public int upixel(int x, int y, int plane) public float fpixel(int x, int y , int plane) public Universal Upixel(int x, int y, int plane)This replicates the functionality of the get scaled instance method of the AWT image class.
public Jimage getfScaledInstance(int nwidth,int nheight ) public synchronized Jimage convolve(double [][]kernel) }
package com.c3d.image; import com.c3d.operators.*; import com.c3d.util.atomic.*; //IntelImage.java /** Class that implements short integer images using mmx processor to speed things up. Requires intel IPL.DLL */ public class IntelImage extends ShortImage { /** Convert a jimage to an intel image */ public IntelImage(Jimage src)
Creates an image of size zero with 3 planes
public IntelImage()Creates an image of size zero with right number of planes
public IntelImage(int plane) public Jimage oneOfThese()Create an image sharing the data with size dx, dy at offset start *
public IntelImage (short d[][], int dx, int dy, int linewidth, int start) public IntelImage(int x, int y, int z) public Jimage getPlane(int k) public ShortImage MkIntelImage (short d[][], int dx, int dy) public ShortImage MkIntelImage(int plane)Creates an image of size zero with right number of planes
public ShortImage replica() public Jimage subImage(int x, int y, int dx, int dy)Combine two structured classes under a dydaic operator. If they are short images, combine using MMX.
public synchronized Universal Inject(Universal b,Doperator op)
When a numeric is subtracted from a Jimage, the result is formed by explicit subtraction, otherwise, operator injection is used.
synchronized Universal dyad(Universal b, Doperator op) //public float l1Norm() // // public float l2Norm() // public Universal minus(Universal b) public Universal plus(Universal b) // public Universal times(Universal b) public Universal times (Universal b)implements ×
// this implementation used because of a bug in intel scalar // multiplication public Jimage shift(int i) public synchronized Jimage convolve(double [][]kernel)convolve with symetrical seperable kernel.
public Jimage convolve(double []k) public Jimage sepconvolve (double []k)This replicates the functionality of the get scaled instance method of the AWT image class.
public Jimage getScaledInstance(int nwidth,int nheight ) public Jimage abs()
native static void intelsq(ImageTransfer a, ImageTransfer result); native static void intelAbs(ImageTransfer a, ImageTransfer result); //native static void intelRGB2HSV(ImageTransfer a,ImageTransfer result); //native static void intelHSV2RGB(ImageTransfer a,ImageTransfer result); native static double intelNorm(ImageTransfer a, int b); native static void intelResize(ImageTransfer a, ImageTransfer b, int xsrc,int ysrc, int xdest,int ydest); native static void intelDyad(int OP, ImageTransfer a,ImageTransfer b,ImageTransfer result); native static void intelconvolve(ImageTransfer x, ImageTransfer z, int [] kernel, int Kx, int Ky); native static void intelsepconvolve(ImageTransfer x, ImageTransfer z, int [] kernel,int []ykernel, int Kx, int Ky); native static void intelscalar(int OP,ImageTransfer a,short b,ImageTransfer result); native static void intelshift(ImageTransfer a,int b,ImageTransfer result); static }
ByteImage © Turing Institute, 1998, W P Cockshott.
A byte image is one that stores its information as a vector of signed bytes. This is necessary in order to handle the numeric range 0..255 in Java which does not support unsigned bytes. It is initialised by explicitly passing in the bytes.
package com.c3d.image; import com.c3d.util.atomic.*; import com.c3d.structured.*; import com.c3d.operators.*; import java.awt.image.*; public class ByteImage extends Jimage {
public byte data[][];The data is stored as linear array of bytes for each plane
public int startindata;The position in the data at which the image origin ( top left ) occurs
public int scanlinelength;The number of bytes in a single scan line of the image data.
public ByteImage() boolean isleaf() public Jimage oneOfThese() public ByteImage(int plane)Creates an image of size zero with right number of planes
public ByteImage(byte d[][], int dx, int dy) public ByteImage(byte d[][], int dx, int dy, int linewidth, int start)Create an image sharing the data with size dx, dy at offset start *
public ByteImage(int x, int y, int z) public Universal concat(Universal a) public Jimage subImage(int x, int y, int dx, int dy)
public void setDimensions(int w, int h) protected Object clone() throws CloneNotSupportedException public Jimage abs() public void setPixel(int x, int y, int z, double p) public float sum(int z) public void setPixel(int x,int y, int z, byte p) public void setPixel(int x, int y, int z, int p) public synchronized void setPixels(int srcX, int srcY, int srcW, int srcH, ColorModel cm, byte pixels[], int srcOff, int srcScan) public synchronized void setPixels(int srcX, int srcY, int srcW, int srcH, ColorModel cm, int pixels[], int srcOff, int srcScan)fSubscription by a scalar returns the appropriate pixel in the 0th plane of the image, allowing for the offset of this image from the start of the image data.
public float fsubscript(int I);
public Universal Inject(Universal b,Doperator op)combine two structured classes under a dydaic operator
public Universal minus(Universal b)
When a numeric is subtracted from a Jimage, the result is formed by explicit subtraction, otherwise, operator injection is used.
public Universal plus (Universal b)implements +
When a numeric is added to a Jimage, the result is formed by addition explicitly, otherwise, operator injection is used.
public byte[][] newData() public Universal times (Universal b)implements ×
public Universal divide (Universal b)implements ¸
int pa(int x,int y)Calculates pixel address, checking bounds.
public short spixel(int x,int y,int plane) public float fpixel(int x, int y , int plane) /**Tex $$p_s=\mu_s+\frac$$ */ public int upixel(int x, int y, int plane) public byte bpixel(int x, int y , int plane) public int rgbpixel(int x, int y)Converts the plane information into a pixel in the direct colour model of java. It has to convert from the signed form of pixels to an unsigned representation before packing into an integer.
public Universal Upixel(int x, int y, int plane) public Jimage convolve(double [][]kernel) public Universal Map(Moperator op) public Jimage getPlane(int k) }
package com.c3d.image; import com.c3d.operators.*; import com.c3d.util.atomic.*; //IntelImage.java /** Class that implements short integer images using mmx processor to speed things up. Requires intel IPL.DLL */ public class IntelBImage extends ByteImage { /** Convert a jimage to an intel image */ public IntelBImage(Jimage src)
Creates an image of size zero with 3 planes
public IntelBImage()Creates an image of size zero with right number of planes
public IntelBImage(int plane) public Jimage oneOfThese()Create an image sharing the data with size dx, dy at offset start *
public IntelBImage (byte d[][], int dx, int dy, int linewidth, int start) public IntelBImage(int x, int y, int z) public Jimage getPlane(int k) public ByteImage MkIntelBImage (byte d[][], int dx, int dy) public ByteImage MkIntelBImage(int plane)Creates an image of size zero with right number of planes
public ByteImage replica() public Jimage subImage(int x, int y, int dx, int dy)Combine two structured classes under a dydaic operator. If they are byte images, combine using MMX.
public synchronized Universal Inject(Universal b,Doperator op)
When a numeric is subtracted from a Jimage, the result is formed by explicit subtraction, otherwise, operator injection is used.
synchronized Universal dyad(Universal b, Doperator op) //public float l1Norm() // // public float l2Norm() // public Universal minus(Universal b) public Universal plus(Universal b) // public Universal times(Universal b) public Universal times (Universal b)implements ×
// this implementation used because of a bug in intel scalar // multiplication public Jimage shift(int i) public synchronized Jimage convolve(double [][]kernel)convolve with symetrical seperable kernel.
public Jimage convolve(double []k) public Jimage sepconvolve (double []k)This replicates the functionality of the get scaled instance method of the AWT image class.
public Jimage getScaledInstanceIntel(int nwidth,int nheight ) public Jimage abs()
native static void intelsq(ImageTransfer a, ImageTransfer result); native static void intelAbs(ImageTransfer a, ImageTransfer result); //native static void intelRGB2HSV(ImageTransfer a,ImageTransfer result); //native static void intelHSV2RGB(ImageTransfer a,ImageTransfer result); native static double intelNorm(ImageTransfer a, int b); native static void intelResize(ImageTransfer a, ImageTransfer b, int xsrc,int ysrc, int xdest,int ydest); native static void intelDyad(int OP, ImageTransfer a,ImageTransfer b,ImageTransfer result); native static void intelconvolve(ImageTransfer x, ImageTransfer z, int [] kernel, int Kx, int Ky); native static void intelsepconvolve(ImageTransfer x, ImageTransfer z, int [] kernel,int []ykernel, int Kx, int Ky); native static void intelscalar(int OP,ImageTransfer a,byte b,ImageTransfer result); native static void intelshift(ImageTransfer a,int b,ImageTransfer result); static }
package com.c3d.image; //ImageTransfer.java
The ImageTransfer class is designed to provide a means of passing one plane of data to the intel image processing library for treatment with the MMX hardware.
public class ImageTransfer { public int height,width; public short data[];The data is stored as linear array of shorts for each plane
public float fdata[]; public int datatype;1= byte datatype 2 = short, 4 = float
public int Start;The position in the data at which the image origin ( top left ) occurs
public int Line;The number of shorts in a single scan line of the image data.
public byte bdata[]; public ImageTransfer(int dx, int dy, float[] d, int start, int linelen) public ImageTransfer(int dx, int dy, byte [] d, int start, int linelen) public ImageTransfer(int dx, int dy, short [] d, int start, int linelen) }
1 © Turing Institute, 1998