\name{morphology}

\alias{dilate}
\alias{closing}
\alias{erode}
\alias{opening}
\alias{makeBrush}

\title{Perform morphological operations on images}

\description{
  Functions to perform morphological operations on binary images.
}

\usage{
  dilate(x, kern, iter)
  erode(x, kern, iter)
  opening(x, kern, iter)
  closing(x, kern, iter)

  makeBrush(size, shape=c('box', 'disc', 'diamond'), step=TRUE)
}

\arguments{
  \item{x}{An \code{Image} object or an array.
    \code{x} is considered as a binary image, whose pixels of value 0
    are considered as background ones and other pixels as
    foreground ones.}
  
  \item{kern}{An \code{Image} object or an array, containing the
    structuring element. \code{kern} is considered as a binary image, whose
    pixels of value 0 are considered as background ones and other pixels as
    foreground ones.}
  
  \item{size}{A numeric containing the size of the brush, in pixels.}
  \item{shape}{A character vector indicating the shape of the brush. Can
    be \code{box}, \code{disc} or \code{diamond}. Default is \code{box}.}
  \item{step}{a logical indicating if the brush is binary. Default is \code{TRUE}.}
  
  \item{iter}{Deprecated argument.}
}

\value{
  \code{dilate}, \code{erode}, \code{opening} and \code{closing} return the
  transformed \code{Image} object or array,  after the corresponding
  morphological operation.
    
  \code{makeBrush} generates a 2D matrix containing the desired brush.
}

\details{
  \code{erode} applies the mask positioning its centre over every background pixel
  (0), every pixel which is not covered by the mask is reset to foreground (1).
  In this way image features grow in size.
  
  \code{dilate} applies the mask positioning its centre over every foreground pixel
  (!=0), every pixel which is not covered by the mask is reset to background (0).
  In this way image features seem shrink in size.

  \code{opening} is an erosion followed by a dilation and \code{closing} is a dilation
  followed by an erosion.

  \code{makeBrush} generates brushes of various sizes and shapes that can be used
  as structuring elements.
}

\author{
  Oleg Sklyar, \email{osklyar@ebi.ac.uk}, 2006
}

\examples{	
    x = readImage(system.file("images", "shapes.png", package="EBImage"))
    if (interactive()) display(x)
    kern = makeBrush(5, shape='diamond')
    if (interactive()) display(kern, title='Structuring element')
    if (interactive()) display(erode(x, kern), title='Erosion of x')
    if (interactive()) display(dilate(x, kern), title='Dilatation of x')

    ## makeBrush 
    x = makeBrush(100, shape='diamond')
    if (interactive()) display(x, title="makeBrush(100, shape='diamond')")
    x = makeBrush(100, shape='disc', step=FALSE)
    if (interactive()) display(x, title="makeBrush(100, shape='disc', step=FALSE)")
}