An OpImage class to perform dilation on a source image.
Dilation for grey 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.
Grey 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 indecies are in bounds.
Intuitively in 2D, the kernel is like
an unbrella 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.
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 persion 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).
// 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]};
}
}
}
}
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.
The kernel cannot be bigger in any dimension than the image data.
Binary Image Dilation
requires the kernel K to be binary.
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.)
// dilating
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;
}
}
}
}
Reference: An Introduction to Nonlinear Image Processing,
by Edward R. Bougherty and Jaakko Astola,
Spie Optical Engineering Press, 1994.
See Also: KernelJAI |