javax.media.jai.operator
Class DilateDescriptor

java.lang.Object
  |
  +--javax.media.jai.OperationDescriptorImpl
        |
        +--javax.media.jai.operator.DilateDescriptor
All Implemented Interfaces:
OperationDescriptor, RegistryElementDescriptor, Serializable

public class DilateDescriptor
extends OperationDescriptorImpl

An OperationDescriptor describing the "Dilate" operation. Dilation for gray scale images can be charaterized by "slide, add and max", while for binary images by "slide and set". As always, the kernel is expected to come with a key position.

Dilation, unlike convolution and most neighborhood operations, actually can grow the image region. But to conform with other image neighborhood operations, the border pixels are set to 0. For a 3 x 3 kernel with the key point at the center, there will be a pixel wide 0 stripe around the border.

When applied to multi-band images the dilation operator processes each band independently using the methodology which would be applied to single band images of the same data type.

Gray scale dilation is a spatial operation that computes each output sample by adding elements of a kernel to the samples surrounding a particular source sample and taking the maximum. A mathematical expression is:

For a kernel K with a key position (xKey,yKey), the dilation of image I at (x,y) is given by:

     max{ I(x-i, y-j) + K(xKey+i, yKey+j): some (i,j) restriction }
  
      where the (i,j) restriction means:
      all possible (i,j) so that both I(x-i,y-j) and K(xKey+i, yKey+j)
      are defined, that is, these indices are in bounds.

 

Intuitively in 2D, the kernel is like an umbrella and the key point is the handle. When the handle moves all over the image surface, the upper outbounds of all the umbrella positions is the dilation. Thus if you want the image to dilate in the upper right direction, the following kernel would do with the bold face key position.

0050
0500
000

Note also that zero kernel have effects on the dilation! That is because of the "max" in the add and max process. Thus a 3 x 1 zero kernel with the key position at the bottom of the kernel dilates the image upwards.

After the kernel is rotated 180 degrees, Pseudo code for dilation operation is as follows. Of course, you should provide the kernel in its (unrotated) original form. Assuming the kernel K is of size M rows x N cols and the key position is (xKey, yKey).

 // gray-scale dilation:
 for every dst pixel location (x,y){
    dst[x][y] = -infinity;
    for (i = -xKey; i < M - xKey; i++){
       for (j = -yKey; j < N - yKey; j++){
          if((x+i, y+j) are in bounds of src &&
	      (xKey+i, yKey+j) are in bounds of K){
             tmp = src[x + i][y + j]+ K[xKey + i][yKey + j];
	       dst[x][y] = max{tmp, dst[x][y]};
          }
       }
    }
 }
 

The kernel cannot be bigger in any dimension than the image data.

Binary Image Dilation requires the kernel K to be binary, that is, have values 0 or 1 for all kernel entries. Intuitively, starting from dst image being a duplicate of src, binary dilation slides the kernel K to place the key position at every non-zero point (x,y) in src image and set dst positions under ones of K to 1.

After the kernel is rotated 180 degrees, the pseudo code for dilation operation is as follows. (Of course, you should provide the kernel in its original unrotated form.)

 
 // binary dilation
 for every dst pixel location (x,y){
    dst[x][y] = src[x][y];
    for (i = -xKey; i < M - xKey; i++){
       for (j = -yKey; j < N - yKey; j++){
         if(src[x+i,y+i]==1 && Key(xKey+i, yKey+j)==1){
            dst[x][y] = 1; break;
          }
       }
    }
 }

 It should be noted that this operation automatically adds a
 value of Boolean.TRUE for the
 JAI.KEY_REPLACE_INDEX_COLOR_MODEL to the given
 configuration so that the operation is performed
 on the pixel values instead of being performed on the indices into
 the color map if the source(s) have an IndexColorModel.
 This addition will take place only if a value for the 
 JAI.KEY_REPLACE_INDEX_COLOR_MODEL has not already been
 provided by the user. Note that the configuration Map
 is cloned before the new hint is added to it. The operation can be 
 smart about the value of the JAI.KEY_REPLACE_INDEX_COLOR_MODEL
 RenderingHints, i.e. while the default value for the
 JAI.KEY_REPLACE_INDEX_COLOR_MODEL is
 Boolean.TRUE, in some cases the operator could set the
 default. 

 

Resource List
Name Value
GlobalName Dilate
LocalName Dilate
Vendor com.sun.media.jai
Description Performs kernel based Dilate on an image.
DocURL http://java.sun.com/products/java-media/jai/forD evelopers/jai-apidocs/javax/media/jai/operator/DilateDescriptor.html
Version 1.1
arg0Desc The dilate kernel.

Parameter List
Name Class Type Default Value
kernel javax.media.jai.KernelJAI NO_PARAMETER_DEFAULT

Reference: An Introduction to Nonlinear Image Processing, by Edward R. Bougherty and Jaakko Astola, Spie Optical Engineering Press, 1994.

Since:
JAI 1.1
See Also:
OperationDescriptor, KernelJAI, ErodeDescriptor, Serialized Form

Fields inherited from class javax.media.jai.OperationDescriptorImpl
resources, sourceNames, supportedModes
 
Fields inherited from interface javax.media.jai.OperationDescriptor
NO_PARAMETER_DEFAULT
 
Constructor Summary
DilateDescriptor()
          Constructor.
 
Method Summary
static RenderedOp create(RenderedImage source0, KernelJAI kernel, RenderingHints hints)
          Performs binary kernel based Dilate operation on the image.
 PropertyGenerator[] getPropertyGenerators()
          Returns an array of PropertyGenerators implementing property inheritance for the "Dilate" operation.
 
Methods inherited from class javax.media.jai.OperationDescriptorImpl
arePropertiesSupported, getDefaultSourceClass, getDestClass, getDestClass, getInvalidRegion, getName, getNumParameters, getNumSources, getParamClasses, getParamDefaults, getParamDefaultValue, getParameterListDescriptor, getParamMaxValue, getParamMinValue, getParamNames, getPropertyGenerators, getRenderableDestClass, getRenderableSourceClasses, getResourceBundle, getResources, getSourceClasses, getSourceClasses, getSourceNames, getSupportedModes, isImmediate, isModeSupported, isRenderableSupported, isRenderedSupported, makeDefaultSourceClassList, validateArguments, validateArguments, validateParameters, validateParameters, validateRenderableArguments, validateRenderableSources, validateSources, validateSources
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

DilateDescriptor

public DilateDescriptor()
Constructor.
Method Detail

getPropertyGenerators

public PropertyGenerator[] getPropertyGenerators()
Returns an array of PropertyGenerators implementing property inheritance for the "Dilate" operation.
Overrides:
getPropertyGenerators in class OperationDescriptorImpl
Returns:
An array of property generators.

create

public static RenderedOp create(RenderedImage source0,
                                KernelJAI kernel,
                                RenderingHints hints)
Performs binary kernel based Dilate operation on the image.

Creates a ParameterBlockJAI from all supplied arguments except hints and invokes JAI.create(String,ParameterBlock,RenderingHints).

Parameters:
source0 - RenderedImage source 0.
kernel - The binary convolution kernel.
hints - The RenderingHints to use. May be null.
Returns:
The RenderedOp destination.
Throws:
IllegalArgumentException - if source0 is null.
IllegalArgumentException - if kernel is null.
See Also:
JAI, ParameterBlockJAI, RenderedOp