mirror of
https://github.com/opencv/opencv.git
synced 2024-12-22 23:28:00 +08:00
795 lines
31 KiB
ReStructuredText
795 lines
31 KiB
ReStructuredText
Miscellaneous Image Transformations
|
|
===================================
|
|
|
|
.. highlight:: cpp
|
|
|
|
.. index:: adaptiveThreshold
|
|
|
|
.. _adaptiveThreshold:
|
|
|
|
adaptiveThreshold
|
|
---------------------
|
|
.. c:function:: void adaptiveThreshold( const Mat& src, Mat& dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C )
|
|
|
|
Applies an adaptive threshold to an array.
|
|
|
|
:param src: Source 8-bit single-channel image.
|
|
|
|
:param dst: Destination image of the same size and the same type as ``src`` .
|
|
|
|
:param maxValue: Non-zero value assigned to the pixels for which the condition is satisfied. See the details below.
|
|
|
|
:param adaptiveMethod: Adaptive thresholding algorithm to use, ``ADAPTIVE_THRESH_MEAN_C`` or ``ADAPTIVE_THRESH_GAUSSIAN_C`` . See the details below.
|
|
|
|
:param thresholdType: Thresholding type that must be either ``THRESH_BINARY`` or ``THRESH_BINARY_INV`` .
|
|
:param blockSize: Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.
|
|
|
|
:param C: Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.
|
|
|
|
The function transforms a grayscale image to a binary image according to the formulae:
|
|
|
|
* **THRESH_BINARY**
|
|
|
|
.. math::
|
|
|
|
dst(x,y) = \fork{\texttt{maxValue}}{if $src(x,y) > T(x,y)$}{0}{otherwise}
|
|
|
|
* **THRESH_BINARY_INV**
|
|
|
|
.. math::
|
|
|
|
dst(x,y) = \fork{0}{if $src(x,y) > T(x,y)$}{\texttt{maxValue}}{otherwise}
|
|
|
|
where
|
|
:math:`T(x,y)` is a threshold calculated individually for each pixel.
|
|
|
|
*
|
|
For the method ``ADAPTIVE_THRESH_MEAN_C`` , the threshold value
|
|
:math:`T(x,y)` is a mean of the
|
|
:math:`\texttt{blockSize} \times \texttt{blockSize}` neighborhood of
|
|
:math:`(x, y)` minus ``C`` .
|
|
|
|
*
|
|
For the method ``ADAPTIVE_THRESH_GAUSSIAN_C`` , the threshold value
|
|
:math:`T(x, y)` is a weighted sum (cross-correlation with a Gaussian window) of the
|
|
:math:`\texttt{blockSize} \times \texttt{blockSize}` neighborhood of
|
|
:math:`(x, y)` minus ``C`` . The default sigma (standard deviation) is used for the specified ``blockSize`` . See
|
|
:func:`getGaussianKernel` .
|
|
|
|
The function can process the image in-place.
|
|
|
|
See Also:
|
|
:func:`threshold`,
|
|
:func:`blur`,
|
|
:func:`GaussianBlur`
|
|
|
|
|
|
.. index:: cvtColor
|
|
|
|
.. _cvtColor:
|
|
|
|
cvtColor
|
|
------------
|
|
.. c:function:: void cvtColor( const Mat& src, Mat& dst, int code, int dstCn=0 )
|
|
|
|
Converts an image from one color space to another.
|
|
|
|
:param src: Source image: 8-bit unsigned, 16-bit unsigned ( ``CV_16UC...`` ), or single-precision floating-point.
|
|
|
|
:param dst: Destination image of the same size and depth as ``src`` .
|
|
|
|
:param code: Color space conversion code. See the details below.??/formatting/
|
|
|
|
:param dstCn: Number of channels in the destination image. If the parameter is 0, the number of the channels is derived automatically from ``src`` and ``code`` .
|
|
|
|
The function converts an input image from one color
|
|
space to another. In case of transformation to-from RGB color space, the order of the channels should be specified explicitly (RGB or BGR).
|
|
|
|
The conventional ranges for R, G, and B channel values are:
|
|
|
|
*
|
|
0 to 255 for ``CV_8U`` images
|
|
|
|
*
|
|
0 to 65535 for ``CV_16U`` images
|
|
|
|
*
|
|
0 to 1 for ``CV_32F`` images
|
|
|
|
In case of linear transformations, the range does not matter.
|
|
But in case of a non-linear transformation, an input RGB image should be normalized to the proper value range to get the correct results, for example, for RGB
|
|
:math:`\rightarrow` L*u*v* transformation. For example, if you have a 32-bit floating-point image directly converted from an 8-bit image without any scaling, then it will have the 0..255 value range, instead of 0..1 assumed by the function. So, before calling ``cvtColor`` , you need first to scale the image down: ::
|
|
|
|
img *= 1./255;
|
|
cvtColor(img, img, CV_BGR2Luv);
|
|
|
|
The function can do the following transformations:
|
|
|
|
*
|
|
Transformations within RGB space like adding/removing the alpha channel, reversing the channel order, conversion to/from 16-bit RGB color (R5:G6:B5 or R5:G5:B5), as well as conversion to/from grayscale using:
|
|
|
|
.. math::
|
|
|
|
\text{RGB[A] to Gray:} \quad Y \leftarrow 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B
|
|
|
|
and
|
|
|
|
.. math::
|
|
|
|
\text{Gray to RGB[A]:} \quad R \leftarrow Y, G \leftarrow Y, B \leftarrow Y, A \leftarrow 0
|
|
|
|
The conversion from a RGB image to gray is done with:
|
|
|
|
::
|
|
|
|
cvtColor(src, bwsrc, CV_RGB2GRAY);
|
|
|
|
..
|
|
|
|
More advanced channel reordering can also be done with
|
|
:func:`mixChannels` .
|
|
|
|
*
|
|
RGB
|
|
:math:`\leftrightarrow` CIE XYZ.Rec 709 with D65 white point ( ``CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB`` ):
|
|
|
|
.. math::
|
|
|
|
\begin{bmatrix} X \\ Y \\ Z
|
|
\end{bmatrix} \leftarrow \begin{bmatrix} 0.412453 & 0.357580 & 0.180423 \\ 0.212671 & 0.715160 & 0.072169 \\ 0.019334 & 0.119193 & 0.950227
|
|
\end{bmatrix} \cdot \begin{bmatrix} R \\ G \\ B
|
|
\end{bmatrix}
|
|
|
|
.. math::
|
|
|
|
\begin{bmatrix} R \\ G \\ B
|
|
\end{bmatrix} \leftarrow \begin{bmatrix} 3.240479 & -1.53715 & -0.498535 \\ -0.969256 & 1.875991 & 0.041556 \\ 0.055648 & -0.204043 & 1.057311
|
|
\end{bmatrix} \cdot \begin{bmatrix} X \\ Y \\ Z
|
|
\end{bmatrix}
|
|
|
|
:math:`X`, :math:`Y` and
|
|
:math:`Z` cover the whole value range (in case of floating-point images,
|
|
:math:`Z` may exceed 1).
|
|
|
|
*
|
|
RGB
|
|
:math:`\leftrightarrow` YCrCb JPEG (or YCC) ( ``CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB`` )
|
|
|
|
.. math::
|
|
|
|
Y \leftarrow 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B
|
|
|
|
.. math::
|
|
|
|
Cr \leftarrow (R-Y) \cdot 0.713 + delta
|
|
|
|
.. math::
|
|
|
|
Cb \leftarrow (B-Y) \cdot 0.564 + delta
|
|
|
|
.. math::
|
|
|
|
R \leftarrow Y + 1.403 \cdot (Cr - delta)
|
|
|
|
.. math::
|
|
|
|
G \leftarrow Y - 0.344 \cdot (Cr - delta) - 0.714 \cdot (Cb - delta)
|
|
|
|
.. math::
|
|
|
|
B \leftarrow Y + 1.773 \cdot (Cb - delta)
|
|
|
|
where
|
|
|
|
.. math::
|
|
|
|
delta = \left \{ \begin{array}{l l} 128 & \mbox{for 8-bit images} \\ 32768 & \mbox{for 16-bit images} \\ 0.5 & \mbox{for floating-point images} \end{array} \right .
|
|
|
|
Y, Cr, and Cb cover the whole value range.
|
|
|
|
*
|
|
RGB :math:`\leftrightarrow` HSV ( ``CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB`` )
|
|
In case of 8-bit and 16-bit images,
|
|
R, G, and B are converted to the floating-point format and scaled to fit the 0 to 1 range.
|
|
|
|
.. math::
|
|
|
|
V \leftarrow max(R,G,B)
|
|
|
|
.. math::
|
|
|
|
S \leftarrow \fork{\frac{V-min(R,G,B)}{V}}{if $V \neq 0$}{0}{otherwise}
|
|
|
|
.. math::
|
|
|
|
H \leftarrow \forkthree{{60(G - B)}/{S}}{if $V=R$}{{120+60(B - R)}/{S}}{if $V=G$}{{240+60(R - G)}/{S}}{if $V=B$}
|
|
|
|
If
|
|
:math:`H<0` then
|
|
:math:`H \leftarrow H+360` . On output
|
|
:math:`0 \leq V \leq 1`, :math:`0 \leq S \leq 1`, :math:`0 \leq H \leq 360` .??
|
|
|
|
The values are then converted to the destination data type:
|
|
|
|
* 8-bit images
|
|
|
|
.. math::
|
|
|
|
V \leftarrow 255 V, S \leftarrow 255 S, H \leftarrow H/2 \text{(to fit to 0 to 255)}
|
|
|
|
* 16-bit images (currently not supported)
|
|
|
|
.. math::
|
|
|
|
V <- 65535 V, S <- 65535 S, H <- H
|
|
|
|
* 32-bit images
|
|
H, S, and V are left as is
|
|
|
|
*
|
|
RGB :math:`\leftrightarrow` HLS ( ``CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB`` ).
|
|
In case of 8-bit and 16-bit images,
|
|
R, G, and B are converted to the floating-point format and scaled to fit the 0 to 1 range.
|
|
|
|
.. math::
|
|
|
|
V_{max} \leftarrow {max}(R,G,B)
|
|
|
|
.. math::
|
|
|
|
V_{min} \leftarrow {min}(R,G,B)
|
|
|
|
.. math::
|
|
|
|
L \leftarrow \frac{V_{max} + V_{min}}{2}
|
|
|
|
.. math::
|
|
|
|
S \leftarrow \fork { \frac{V_{max} - V_{min}}{V_{max} + V_{min}} }{if $L < 0.5$ }
|
|
{ \frac{V_{max} - V_{min}}{2 - (V_{max} + V_{min})} }{if $L \ge 0.5$ }
|
|
|
|
.. math::
|
|
|
|
H \leftarrow \forkthree {{60(G - B)}/{S}}{if $V_{max}=R$ }
|
|
{{120+60(B - R)}/{S}}{if $V_{max}=G$ }
|
|
{{240+60(R - G)}/{S}}{if $V_{max}=B$ }
|
|
|
|
If
|
|
:math:`H<0` then
|
|
:math:`H \leftarrow H+360` . On output
|
|
:math:`0 \leq L \leq 1`, :math:`0 \leq S \leq 1`, :math:`0 \leq H \leq 360` .
|
|
|
|
The values are then converted to the destination data type:
|
|
|
|
* 8-bit images
|
|
|
|
.. math::
|
|
|
|
V \leftarrow 255 \cdot V, S \leftarrow 255 \cdot S, H \leftarrow H/2 \; \text{(to fit to 0 to 255)}
|
|
|
|
* 16-bit images (currently not supported)
|
|
|
|
.. math::
|
|
|
|
V <- 65535 \cdot V, S <- 65535 \cdot S, H <- H
|
|
|
|
* 32-bit images
|
|
H, S, V are left as is
|
|
|
|
*
|
|
RGB :math:`\leftrightarrow` CIE L*a*b* ( ``CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB`` ).
|
|
In case of 8-bit and 16-bit images,
|
|
R, G, and B are converted to the floating-point format and scaled to fit the 0 to 1 range.
|
|
|
|
.. math::
|
|
|
|
\vecthree{X}{Y}{Z} \leftarrow \vecthreethree{0.412453}{0.357580}{0.180423}{0.212671}{0.715160}{0.072169}{0.019334}{0.119193}{0.950227} \cdot \vecthree{R}{G}{B}
|
|
|
|
.. math::
|
|
|
|
X \leftarrow X/X_n, \text{where} X_n = 0.950456
|
|
|
|
.. math::
|
|
|
|
Z \leftarrow Z/Z_n, \text{where} Z_n = 1.088754
|
|
|
|
.. math::
|
|
|
|
L \leftarrow \fork{116*Y^{1/3}-16}{for $Y>0.008856$}{903.3*Y}{for $Y \le 0.008856$}
|
|
|
|
.. math::
|
|
|
|
a \leftarrow 500 (f(X)-f(Y)) + delta
|
|
|
|
.. math::
|
|
|
|
b \leftarrow 200 (f(Y)-f(Z)) + delta
|
|
|
|
where
|
|
|
|
.. math::
|
|
|
|
f(t)= \fork{t^{1/3}}{for $t>0.008856$}{7.787 t+16/116}{for $t\leq 0.008856$}
|
|
|
|
and
|
|
|
|
.. math::
|
|
|
|
delta = \fork{128}{for 8-bit images}{0}{for floating-point images}
|
|
|
|
This outputs
|
|
:math:`0 \leq L \leq 100`, :math:`-127 \leq a \leq 127`, :math:`-127 \leq b \leq 127` . The values are then converted to the destination data type:
|
|
|
|
* 8-bit images
|
|
|
|
.. math::
|
|
|
|
L \leftarrow L*255/100, \; a \leftarrow a + 128, \; b \leftarrow b + 128
|
|
|
|
* 16-bit images
|
|
(currently not supported)
|
|
|
|
* 32-bit images
|
|
L, a, and b are left as is
|
|
|
|
*
|
|
RGB :math:`\leftrightarrow` CIE L*u*v* ( ``CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB`` ).
|
|
In case of 8-bit and 16-bit images,
|
|
R, G, and B are converted to the floating-point format and scaled to fit 0 to 1 range.
|
|
|
|
.. math::
|
|
|
|
\vecthree{X}{Y}{Z} \leftarrow \vecthreethree{0.412453}{0.357580}{0.180423}{0.212671}{0.715160}{0.072169}{0.019334}{0.119193}{0.950227} \cdot \vecthree{R}{G}{B}
|
|
|
|
.. math::
|
|
|
|
L \leftarrow \fork{116 Y^{1/3}}{for $Y>0.008856$}{903.3 Y}{for $Y\leq 0.008856$}
|
|
|
|
.. math::
|
|
|
|
u' \leftarrow 4*X/(X + 15*Y + 3 Z)
|
|
|
|
.. math::
|
|
|
|
v' \leftarrow 9*Y/(X + 15*Y + 3 Z)
|
|
|
|
.. math::
|
|
|
|
u \leftarrow 13*L*(u' - u_n) \quad \text{where} \quad u_n=0.19793943
|
|
|
|
.. math::
|
|
|
|
v \leftarrow 13*L*(v' - v_n) \quad \text{where} \quad v_n=0.46831096
|
|
|
|
This outputs
|
|
:math:`0 \leq L \leq 100`, :math:`-134 \leq u \leq 220`, :math:`-140 \leq v \leq 122` .
|
|
|
|
The values are then converted to the destination data type:
|
|
|
|
* 8-bit images
|
|
|
|
.. math::
|
|
|
|
L \leftarrow 255/100 L, \; u \leftarrow 255/354 (u + 134), \; v \leftarrow 255/256 (v + 140)
|
|
|
|
* 16-bit images
|
|
(currently not supported)
|
|
|
|
* 32-bit images
|
|
L, u, and v are left as is
|
|
|
|
The above formulae for converting RGB to/from various color spaces have been taken from multiple sources on the web, primarily from the Charles Poynton site
|
|
http://www.poynton.com/ColorFAQ.html
|
|
|
|
*
|
|
Bayer :math:`\rightarrow` RGB ( ``CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerGB2RGB, CV_BayerRG2RGB, CV_BayerGR2RGB`` ). The Bayer pattern is widely used in CCD and CMOS cameras. It enables you to get color pictures from a single plane where R,G, and B pixels (sensors of a particular component) are interleaved as follows:
|
|
|
|
.. math::
|
|
|
|
\newcommand{\Rcell}{\color{red}R} \newcommand{\Gcell}{\color{green}G} \newcommand{\Bcell}{\color{blue}B} \definecolor{BackGray}{rgb}{0.8,0.8,0.8} \begin{array}{ c c c c c } \Rcell & \Gcell & \Rcell & \Gcell & \Rcell \\ \Gcell & \colorbox{BackGray}{\Bcell} & \colorbox{BackGray}{\Gcell} & \Bcell & \Gcell \\ \Rcell & \Gcell & \Rcell & \Gcell & \Rcell \\ \Gcell & \Bcell & \Gcell & \Bcell & \Gcell \\ \Rcell & \Gcell & \Rcell & \Gcell & \Rcell \end{array}
|
|
|
|
The output RGB components of a pixel are interpolated from 1, 2, or
|
|
4 neighbors of the pixel having the same color. There are several
|
|
modifications of the above pattern that can be achieved by shifting
|
|
the pattern one pixel left and/or one pixel up. The two letters
|
|
:math:`C_1` and
|
|
:math:`C_2` in the conversion constants ``CV_Bayer`` :math:`C_1 C_2` ``2BGR`` and ``CV_Bayer`` :math:`C_1 C_2` ``2RGB`` indicate the particular pattern
|
|
type. These are components from the second row, second and third
|
|
columns, respectively. For example, the above pattern has a very
|
|
popular "BG" type.
|
|
|
|
.. index:: distanceTransform
|
|
|
|
.. _distanceTransform:
|
|
|
|
distanceTransform
|
|
---------------------
|
|
.. c:function:: void distanceTransform( const Mat& src, Mat& dst, int distanceType, int maskSize )
|
|
|
|
.. c:function:: void distanceTransform( const Mat& src, Mat& dst, Mat& labels, int distanceType, int maskSize )
|
|
|
|
Calculates the distance to the closest zero pixel for each pixel of the source image.
|
|
|
|
:param src: 8-bit, single-channel (binary) source image.
|
|
|
|
:param dst: Output image with calculated distances. It is a 32-bit floating-point, single-channel image of the same size as ``src`` .
|
|
:param distanceType: Type of distance. It can be ``CV_DIST_L1, CV_DIST_L2`` , or ``CV_DIST_C`` .
|
|
:param maskSize: Size of the distance transform mask. It can be 3, 5, or ``CV_DIST_MASK_PRECISE`` (the latter option is only supported by the first function??). In case of the ``CV_DIST_L1`` or ``CV_DIST_C`` distance type, the parameter is forced to 3 because a :math:`3\times 3` mask gives the same result as :math:`5\times 5` or any larger aperture.
|
|
|
|
:param labels: Optional output 2D array of labels (the discrete Voronoi diagram). It has the type ``CV_32SC1`` and the same size as ``src`` . See the details below.
|
|
|
|
The functions ``distanceTransform`` calculate the approximate or precise
|
|
distance from every binary image pixel to the nearest zero pixel.
|
|
For zero image pixels, the distance will obviously be zero.
|
|
|
|
When ``maskSize == CV_DIST_MASK_PRECISE`` and ``distanceType == CV_DIST_L2`` , the function runs the algorithm described in
|
|
Felzenszwalb04.
|
|
|
|
In other cases, the algorithm
|
|
Borgefors86
|
|
is used. This means that
|
|
for a pixel the function finds the shortest path to the nearest zero pixel
|
|
consisting of basic shifts: horizontal,
|
|
vertical, diagonal, or knight's move (the latest is available for a
|
|
:math:`5\times 5` mask). The overall distance is calculated as a sum of these
|
|
basic distances. Since the distance function should be symmetric,
|
|
all of the horizontal and vertical shifts must have the same cost (denoted as ``a`` ), all the diagonal shifts must have the
|
|
same cost (denoted as ``b`` ), and all knight's moves must have
|
|
the same cost (denoted as ``c`` ). For the ``CV_DIST_C`` and ``CV_DIST_L1`` types, the distance is calculated precisely,
|
|
whereas for ``CV_DIST_L2`` (Euclidian distance) the distance
|
|
can be calculated only with a relative error (a
|
|
:math:`5\times 5` mask
|
|
gives more accurate results). For ``a``,``b`` , and ``c`` , OpenCV uses the values suggested in the original paper:
|
|
|
|
.. table::
|
|
|
|
============== =================== ======================
|
|
``CV_DIST_C`` :math:`(3\times 3)` a = 1, b = 1 \
|
|
============== =================== ======================
|
|
``CV_DIST_L1`` :math:`(3\times 3)` a = 1, b = 2 \
|
|
``CV_DIST_L2`` :math:`(3\times 3)` a=0.955, b=1.3693 \
|
|
``CV_DIST_L2`` :math:`(5\times 5)` a=1, b=1.4, c=2.1969 \
|
|
============== =================== ======================
|
|
|
|
Typically, for a fast, coarse distance estimation ``CV_DIST_L2``,a
|
|
:math:`3\times 3` mask is used. For a more accurate distance estimation ``CV_DIST_L2`` , a
|
|
:math:`5\times 5` mask or the precise algorithm is used.
|
|
Note that both the precise and the approximate algorithms are linear on the number of pixels.
|
|
|
|
The second variant of the function does not only compute the minimum distance for each pixel
|
|
:math:`(x, y)` but also identifies the nearest connected
|
|
component consisting of zero pixels. Index of the component is stored in
|
|
:math:`\texttt{labels}(x, y)` .
|
|
The connected components of zero pixels are also found and marked by the function.
|
|
|
|
In this mode, the complexity is still linear.
|
|
That is, the function provides a very fast way to compute the Voronoi diagram for a binary image.
|
|
Currently, the second variant can use only the approximate distance transform algorithm.
|
|
|
|
.. index:: floodFill
|
|
|
|
.. _floodFill:
|
|
|
|
floodFill
|
|
-------------
|
|
.. c:function:: int floodFill( Mat& image, Point seed, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )
|
|
|
|
.. c:function:: int floodFill( Mat& image, Mat& mask, Point seed, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )
|
|
|
|
Fills a connected component with the given color.
|
|
|
|
:param image: Input/output 1- or 3-channel, 8-bit, or floating-point image. It is modified by the function unless the ``FLOODFILL_MASK_ONLY`` flag is set in the second variant of the function. See the details below.
|
|
|
|
:param mask: (For the second function only) Operation mask that should be a single-channel 8-bit image, 2 pixels wider and 2 pixels taller. The function uses and updates the mask, so you take responsibility of initializing the ``mask`` content. Flood-filling cannot go across non-zero pixels in the mask. For example, an edge detector output can be used as a mask to stop filling at edges. It is possible to use the same mask in multiple calls to the function to make sure the filled area does not overlap.
|
|
|
|
**Note** : Since the mask is larger than the filled image, a pixel :math:`(x, y)` in ``image`` corresponds to the pixel :math:`(x+1, y+1)` in the ``mask`` .
|
|
:param seed: Starting point.
|
|
|
|
:param newVal: New value of the repainted domain pixels.
|
|
|
|
:param loDiff: Maximal lower brightness/color difference between the currently observed pixel and one of its neighbors belonging to the component, or a seed pixel being added to the component.
|
|
|
|
:param upDiff: Maximal upper brightness/color difference between the currently observed pixel and one of its neighbors belonging to the component, or a seed pixel being added to the component.
|
|
|
|
:param rect: Optional output parameter set by the function to the minimum bounding rectangle of the repainted domain.
|
|
|
|
:param flags: Operation flags. Lower bits contain a connectivity value, 4 (default) or 8, used within the function. Connectivity determines which neighbors of a pixel are considered. Upper bits can be 0 or a combination of the following flags:
|
|
|
|
* **FLOODFILL_FIXED_RANGE** If set, the difference between the current pixel and seed pixel is considered. Otherwise, the difference between neighbor pixels is considered (that is, the range is floating).
|
|
|
|
* **FLOODFILL_MASK_ONLY** If set, the function does not change the image ( ``newVal`` is ignored), but fills the mask. The flag can be used for the second variant only.
|
|
|
|
The functions ``floodFill`` fill a connected component starting from the seed point with the specified color. The connectivity is determined by the color/brightness closeness of the neighbor pixels. The pixel at
|
|
:math:`(x,y)` is considered to belong to the repainted domain if??:
|
|
|
|
* Grayscale image, floating range
|
|
|
|
.. math::
|
|
|
|
\texttt{src} (x',y')- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} (x',y')+ \texttt{upDiff}
|
|
|
|
* Grayscale image, fixed range
|
|
|
|
.. math::
|
|
|
|
\texttt{src} ( \texttt{seed} .x, \texttt{seed} .y)- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} ( \texttt{seed} .x, \texttt{seed} .y)+ \texttt{upDiff}
|
|
|
|
* Color image, floating range
|
|
|
|
.. math::
|
|
|
|
\texttt{src} (x',y')_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} (x',y')_r+ \texttt{upDiff} _r
|
|
|
|
.. math::
|
|
|
|
\texttt{src} (x',y')_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} (x',y')_g+ \texttt{upDiff} _g
|
|
|
|
.. math::
|
|
|
|
\texttt{src} (x',y')_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} (x',y')_b+ \texttt{upDiff} _b
|
|
|
|
* Color image, fixed range
|
|
|
|
.. math::
|
|
|
|
\texttt{src} ( \texttt{seed} .x, \texttt{seed} .y)_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} ( \texttt{seed} .x, \texttt{seed} .y)_r+ \texttt{upDiff} _r
|
|
|
|
.. math::
|
|
|
|
\texttt{src} ( \texttt{seed} .x, \texttt{seed} .y)_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} ( \texttt{seed} .x, \texttt{seed} .y)_g+ \texttt{upDiff} _g
|
|
|
|
.. math::
|
|
|
|
\texttt{src} ( \texttt{seed} .x, \texttt{seed} .y)_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} ( \texttt{seed} .x, \texttt{seed} .y)_b+ \texttt{upDiff} _b
|
|
|
|
where
|
|
:math:`src(x',y')` is the value of one of pixel neighbors that is already known to belong to the component. That is, to be added to the connected component, a color/brightness of the pixel should be close enough to:
|
|
|
|
*
|
|
Color/brightness of one of its neighbors that are already referred to in?? the connected component in case of floating range.
|
|
|
|
*
|
|
Color/brightness of the seed point in case of fixed range.
|
|
|
|
Use these functions to either mark a connected component with the specified color in-place, or build a mask and then extract the contour, or copy the region to another image, and so on. Various modes of the function are demonstrated in the ``floodfill.c`` sample.
|
|
|
|
See Also:
|
|
:func:`findContours`
|
|
|
|
.. index:: inpaint
|
|
|
|
.. _inpaint:
|
|
|
|
inpaint
|
|
-----------
|
|
.. c:function:: void inpaint( const Mat& src, const Mat& inpaintMask, Mat& dst, double inpaintRadius, int flags )
|
|
|
|
Removes?? the selected region in an image.
|
|
|
|
:param src: Input 8-bit 1-channel or 3-channel image.
|
|
|
|
:param inpaintMask: Inpainting mask, 8-bit 1-channel image. Non-zero pixels indicate the area that needs to be inpainted.
|
|
|
|
:param dst: Output image with the same size and type as ``src`` .
|
|
|
|
:param inpaintRadius: Radius of a circlular neighborhood of each point inpainted that is considered by the algorithm.
|
|
|
|
:param flags: Inpainting method that could be one of the following:
|
|
|
|
* **INPAINT_NS** Navier-Stokes based method.
|
|
|
|
* **INPAINT_TELEA** Method by Alexandru Telea Telea04.
|
|
|
|
The function reconstructs the selected image area from the pixel near the area boundary. The function may be used to remove dust and scratches from a scanned photo, or to remove undesirable objects from still images or video. See
|
|
http://en.wikipedia.org/wiki/Inpainting
|
|
for more details.
|
|
|
|
.. index:: integral
|
|
|
|
.. _integral:
|
|
|
|
integral
|
|
------------
|
|
.. c:function:: void integral( const Mat& image, Mat& sum, int sdepth=-1 )
|
|
|
|
.. c:function:: void integral( const Mat& image, Mat& sum, Mat& sqsum, int sdepth=-1 )
|
|
|
|
.. c:function:: void integral( const Mat& image, Mat& sum, Mat& sqsum, Mat& tilted, int sdepth=-1 )
|
|
|
|
Calculates the integral of an image.
|
|
|
|
:param image: Source image as :math:`W \times H` , 8-bit or floating-point (32f or 64f).
|
|
|
|
:param sum: Integral image as :math:`(W+1)\times (H+1)` , 32-bit integer or floating-point (32f or 64f).
|
|
|
|
:param sqsum: Integral image for squared pixel values represented as?? :math:`(W+1)\times (H+1)` , double precision floating-point (64f).
|
|
|
|
:param tilted: Integral for the image rotated by 45 degrees represented as :math:`(W+1)\times (H+1)` , with the same data type as ``sum`` .
|
|
|
|
:param sdepth: Desired depth of the integral and the tilted integral images, ``CV_32S`` , ``CV_32F`` , or ``CV_64F`` .
|
|
|
|
The functions calculate one or more integral images for the source image as following:
|
|
|
|
.. math::
|
|
|
|
\texttt{sum} (X,Y) = \sum _{x<X,y<Y} \texttt{image} (x,y)
|
|
|
|
.. math::
|
|
|
|
\texttt{sqsum} (X,Y) = \sum _{x<X,y<Y} \texttt{image} (x,y)^2
|
|
|
|
.. math::
|
|
|
|
\texttt{tilted} (X,Y) = \sum _{y<Y,abs(x-X+1) \leq Y-y-1} \texttt{image} (x,y)
|
|
|
|
Using these integral images, you can calculate sum, mean and standard deviation over a specific up-right or rotated rectangular region of the image in a constant time, for example:
|
|
|
|
.. math::
|
|
|
|
\sum _{x_1 \leq x < x_2, \, y_1 \leq y < y_2} \texttt{image} (x,y) = \texttt{sum} (x_2,y_2)- \texttt{sum} (x_1,y_2)- \texttt{sum} (x_2,y_1)+ \texttt{sum} (x_1,x_1)
|
|
|
|
It makes possible to do a fast blurring or fast block correlation with a variable window size, for example. In case of multi-channel images, sums for each channel are accumulated independently.
|
|
|
|
As a practical example, the next figure shows the calculation of the integral of a straight rectangle ``Rect(3,3,3,2)`` and of a tilted rectangle ``Rect(5,1,2,3)`` . The selected pixels in the original ``image`` are shown, as well as the relative pixels in the integral images ``sum`` and ``tilted`` .
|
|
|
|
\begin{center}
|
|
|
|
.. image:: pics/integral.png
|
|
|
|
\end{center}
|
|
|
|
.. index:: threshold
|
|
|
|
.. _threshold:
|
|
|
|
threshold
|
|
-------------
|
|
.. c:function:: double threshold( const Mat& src, Mat& dst, double thresh, double maxVal, int thresholdType )
|
|
|
|
Applies a fixed-level threshold to each array element.
|
|
|
|
:param src: Source array (single-channel, 8-bit of 32-bit floating point)
|
|
|
|
:param dst: Destination array of the same size and type as ``src`` .
|
|
|
|
:param thresh: Threshold value.
|
|
|
|
:param maxVal: Maximum value to use with the ``THRESH_BINARY`` and ``THRESH_BINARY_INV`` thresholding types.
|
|
|
|
:param thresholdType: Thresholding type (see the details below).
|
|
|
|
The function applies fixed-level thresholding
|
|
to a single-channel array. The function is typically used to get a
|
|
bi-level (binary) image out of a grayscale image (
|
|
:func:`compare` could
|
|
be also used for this purpose) or for removing a noise, that is, filtering
|
|
out pixels with too small or too large values. There are several
|
|
types of thresholding supported by the function. They are determined by ``thresholdType`` :
|
|
|
|
* **THRESH_BINARY**
|
|
|
|
.. math::
|
|
|
|
\texttt{dst} (x,y) = \fork{\texttt{maxVal}}{if $\texttt{src}(x,y) > \texttt{thresh}$}{0}{otherwise}
|
|
|
|
* **THRESH_BINARY_INV**
|
|
|
|
.. math::
|
|
|
|
\texttt{dst} (x,y) = \fork{0}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{maxVal}}{otherwise}
|
|
|
|
* **THRESH_TRUNC**
|
|
|
|
.. math::
|
|
|
|
\texttt{dst} (x,y) = \fork{\texttt{threshold}}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{src}(x,y)}{otherwise}
|
|
|
|
* **THRESH_TOZERO**
|
|
|
|
.. math::
|
|
|
|
\texttt{dst} (x,y) = \fork{\texttt{src}(x,y)}{if $\texttt{src}(x,y) > \texttt{thresh}$}{0}{otherwise}
|
|
|
|
* **THRESH_TOZERO_INV**
|
|
|
|
.. math::
|
|
|
|
\texttt{dst} (x,y) = \fork{0}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{src}(x,y)}{otherwise}
|
|
|
|
Also, the special value ``THRESH_OTSU`` may be combined with
|
|
one of the above values. In this case, the function determines the optimal threshold
|
|
value using Otsu's algorithm and uses it instead of the specified ``thresh`` .
|
|
The function returns the computed threshold value.
|
|
Currently, Otsu's method is implemented only for 8-bit images.
|
|
|
|
.. image:: pics/threshold.png
|
|
|
|
See Also:
|
|
:func:`adaptiveThreshold`,
|
|
:func:`findContours`,
|
|
:func:`compare`,
|
|
:func:`min`,
|
|
:func:`max`
|
|
|
|
.. index:: watershed
|
|
|
|
.. _watershed:
|
|
|
|
watershed
|
|
-------------
|
|
.. c:function:: void watershed( const Mat& image, Mat& markers )
|
|
|
|
Performs a marker-based image segmentation using the watershed algrorithm.
|
|
|
|
:param image: Input 8-bit 3-channel image.
|
|
|
|
:param markers: Input/output 32-bit single-channel image (map) of markers. It should have the same size as ``image`` .
|
|
|
|
The function implements one of the variants
|
|
of watershed, non-parametric marker-based segmentation algorithm,
|
|
described in
|
|
Meyer92??
|
|
. Before passing the image to the
|
|
function, you have to roughly outline the desired regions in the image ``markers`` with positive (
|
|
:math:`>0` ) indices. So, every region is
|
|
represented as one or more connected components with the pixel values
|
|
1, 2, 3, and so on. Such markers can be retrieved from a binary mask
|
|
using
|
|
:func:`findContours` and
|
|
:func:`drawContours` (see the ``watershed.cpp`` demo).
|
|
The markers are "seeds" of the future image
|
|
regions. All the other pixels in ``markers`` , whose relation to the
|
|
outlined regions is not known and should be defined by the algorithm,
|
|
should be set to 0's. In the function output, each pixel in
|
|
markers is set to a value of the "seed" components or to -1 at
|
|
boundaries between the regions.
|
|
|
|
**Note**: Every two neighbor connected
|
|
components are not necessarily separated by a watershed boundary (-1's pixels); for
|
|
example, when such tangent components exist in the initial
|
|
marker image. Visual demonstration and usage example of the function
|
|
can be found in the OpenCV samples directory (see the ``watershed.cpp`` demo).
|
|
|
|
See Also:
|
|
:func:`findContours`
|
|
|
|
.. index:: grabCut
|
|
|
|
.. _grabCut:
|
|
|
|
grabCut
|
|
-------
|
|
|
|
.. c:function:: void grabCut(const Mat& image, Mat& mask, Rect rect, Mat& bgdModel, Mat& fgdModel, int iterCount, int mode )
|
|
|
|
Runs the GrabCut algorithm.
|
|
|
|
:param image: Input 8-bit 3-channel image.
|
|
|
|
:param mask: Input/output 8-bit single-channel mask. Its elements may have one of four values. The mask is initialized when ``mode==GC_INIT_WITH_RECT`` .
|
|
|
|
* **GC_BGD** defines an obvious background pixel.??
|
|
|
|
* **GC_FGD** defines an obvious foreground (object) pixel.
|
|
|
|
* **GC_PR_BGD** defines a possible background pixel.
|
|
|
|
* **GC_PR_BGD** defines a possible foreground pixel.
|
|
|
|
:param rect: ROI containing a segmented object. The pixels outside of the ROI are marked as "obvious background"??. The parameter is only used when ``mode==GC_INIT_WITH_RECT`` .
|
|
|
|
:param bgdModel, fgdModel: Temporary arrays used for segmentation. Do not modify them while you are processing the same image.
|
|
|
|
:param iterCount: Number of iterations the algorithm should make before returning the result. Note that the result can be refined with further calls with ``mode==GC_INIT_WITH_MASK`` or ``mode==GC_EVAL`` .
|
|
|
|
:param mode: Operation mode that could be one of the following:
|
|
|
|
* **GC_INIT_WITH_RECT** The function initializes the state and the mask using the provided rectangle. After that it runs ``iterCount`` iterations of the algorithm.
|
|
|
|
* **GC_INIT_WITH_MASK** The function initializes the state using the provided mask. Note that ``GC_INIT_WITH_RECT`` and ``GC_INIT_WITH_MASK`` can be combined. Then, all the pixels outside of the ROI are automatically initialized with ``GC_BGD`` .
|
|
|
|
* **GC_EVAL** The value means that algorithm should just resume.
|
|
|
|
The function implements the `GrabCut image segmentation algorithm <http://en.wikipedia.org/wiki/GrabCut>`_.
|
|
See the sample grabcut.cpp to learn how to use the function.
|