mirror of
https://github.com/opencv/opencv.git
synced 2024-11-29 22:00:25 +08:00
787 lines
31 KiB
ReStructuredText
787 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; will have the same size and the same type as ``src``
|
|
|
|
:param maxValue: The non-zero value assigned to the pixels for which the condition is satisfied. See the discussion
|
|
|
|
:param adaptiveMethod: Adaptive thresholding algorithm to use, ``ADAPTIVE_THRESH_MEAN_C`` or ``ADAPTIVE_THRESH_GAUSSIAN_C`` (see the discussion)
|
|
|
|
:param thresholdType: Thresholding type; must be one of ``THRESH_BINARY`` or ``THRESH_BINARY_INV``
|
|
:param blockSize: The size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on
|
|
|
|
:param C: The constant subtracted from the mean or weighted mean (see the discussion); normally, it's positive, but may be zero or negative as well
|
|
|
|
The function transforms a grayscale image to a binary image according to the formulas:
|
|
|
|
* **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 the mean of a
|
|
: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 the weighted sum (i.e. cross-correlation with a Gaussian window) of a
|
|
: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 image from one color space to another
|
|
|
|
:param src: The source image, 8-bit unsigned, 16-bit unsigned ( ``CV_16UC...`` ) or single-precision floating-point
|
|
|
|
:param dst: The destination image; will have the same size and the same depth as ``src``
|
|
:param code: The color space conversion code; see the discussion
|
|
|
|
:param dstCn: The number of channels in the destination image; if the parameter is 0, the number of the channels will be derived automatically from ``src`` and the ``code``
|
|
|
|
The function converts the input image from one color
|
|
space to another. In the case of transformation to-from RGB color space the ordering 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 and
|
|
|
|
*
|
|
0 to 1 for ``CV_32F`` images.
|
|
|
|
Of course, in the case of linear transformations the range does not matter,
|
|
but in the non-linear cases the input RGB image should be normalized to the proper value range in order to get the correct results, e.g. for RGB
|
|
:math:`\rightarrow` L*u*v* transformation. For example, if you have a 32-bit floating-point image directly converted from 8-bit image without any scaling, then it will have 0..255 value range, instead of the assumed by the function 0..1. 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);
|
|
|
|
..
|
|
|
|
Some 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 the case of floating-point images
|
|
:math:`Z` may exceed 1).
|
|
|
|
*
|
|
RGB
|
|
:math:`\leftrightarrow` YCrCb JPEG (a.k.a. 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 the case of 8-bit and 16-bit images
|
|
R, G and B are converted to 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, V are left as is
|
|
|
|
*
|
|
RGB :math:`\leftrightarrow` HLS ( ``CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB`` ).
|
|
in the case of 8-bit and 16-bit images
|
|
R, G and B are converted to 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 the case of 8-bit and 16-bit images
|
|
R, G and B are converted to 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}
|
|
|
|
On output
|
|
: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, b are left as is
|
|
|
|
*
|
|
RGB :math:`\leftrightarrow` CIE L*u*v* ( ``CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB`` )
|
|
in the case of 8-bit and 16-bit images
|
|
R, G and B are converted to 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
|
|
|
|
On output
|
|
: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, v are left as is
|
|
|
|
The above formulas for converting RGB to/from various color spaces have been taken from multiple sources on 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 allows one to get color pictures from a single plane where R,G and B pixels (sensors of a particular component) are interleaved like this:
|
|
|
|
.. 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 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; will be 32-bit floating-point, single-channel image of the same size as ``src``
|
|
:param distanceType: Type of distance; can be ``CV_DIST_L1, CV_DIST_L2`` or ``CV_DIST_C``
|
|
:param maskSize: Size of the distance transform mask; can be 3, 5 or ``CV_DIST_MASK_PRECISE`` (the latter option is only supported by the first of the functions). In the case of ``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 a :math:`5\times 5` or any larger aperture.
|
|
|
|
:param labels: The optional output 2d array of labels - the discrete Voronoi diagram; will have type ``CV_32SC1`` and the same size as ``src`` . See the discussion
|
|
|
|
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, that is,
|
|
for 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. Because the distance function should be symmetric,
|
|
all of the horizontal and vertical shifts must have the same cost (that
|
|
is denoted as ``a`` ), all the diagonal shifts must have the
|
|
same cost (denoted ``b`` ), and all knight's moves must have
|
|
the same cost (denoted ``c`` ). For ``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 some 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, and 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 it also identifies the nearest 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 Voronoi diagram for the binary image.
|
|
Currently, this second variant can only use 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 below)
|
|
|
|
:param mask: (For the second function only) Operation mask, should be a single-channel 8-bit image, 2 pixels wider and 2 pixels taller. The function uses and updates the mask, so the user takes responsibility of initializing the ``mask`` content. Flood-filling can't 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 do not overlap. **Note** : because the mask is larger than the filled image, a pixel :math:`(x, y)` in ``image`` will correspond to the pixel :math:`(x+1, y+1)` in the ``mask``
|
|
:param seed: The 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: The optional output parameter that the function sets to the minimum bounding rectangle of the repainted domain
|
|
|
|
:param flags: The operation flags. Lower bits contain connectivity value, 4 (by 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 (i.e. the range is floating)
|
|
|
|
* **FLOODFILL_MASK_ONLY** (for the second variant only) if set, the function does not change the image ( ``newVal`` is ignored), but fills the mask
|
|
|
|
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 pixel's color/brightness should be close enough to the:
|
|
|
|
*
|
|
color/brightness of one of its neighbors that are already referred to the connected component in the case of floating range
|
|
|
|
*
|
|
color/brightness of the seed point in the case of fixed range.
|
|
|
|
By using these functions you can 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 etc. Various modes of the function are demonstrated in ``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 )
|
|
|
|
Inpaints the selected region in the image.
|
|
|
|
:param src: The input 8-bit 1-channel or 3-channel image.
|
|
|
|
:param inpaintMask: The inpainting mask, 8-bit 1-channel image. Non-zero pixels indicate the area that needs to be inpainted.
|
|
|
|
:param dst: The output image; will have the same size and the same type as ``src``
|
|
|
|
:param inpaintRadius: The radius of a circlular neighborhood of each point inpainted that is considered by the algorithm.
|
|
|
|
:param flags: The inpainting method, one of the following:
|
|
|
|
* **INPAINT_NS** Navier-Stokes based method.
|
|
|
|
* **INPAINT_TELEA** The 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: The source image, :math:`W \times H` , 8-bit or floating-point (32f or 64f)
|
|
|
|
:param sum: The integral image, :math:`(W+1)\times (H+1)` , 32-bit integer or floating-point (32f or 64f)
|
|
|
|
:param sqsum: The integral image for squared pixel values, :math:`(W+1)\times (H+1)` , double precision floating-point (64f)
|
|
|
|
:param tilted: The integral for the image rotated by 45 degrees, :math:`(W+1)\times (H+1)` , the same data type as ``sum``
|
|
|
|
:param sdepth: The 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, one may 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 variable window size, for example. In the 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; will have the same size and the same type as ``src``
|
|
|
|
:param thresh: Threshold value
|
|
|
|
:param maxVal: Maximum value to use with ``THRESH_BINARY`` and ``THRESH_BINARY_INV`` thresholding types
|
|
|
|
:param thresholdType: Thresholding type (see the discussion)
|
|
|
|
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, i.e. filtering
|
|
out pixels with too small or too large values. There are several
|
|
types of thresholding that the function supports that 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 )
|
|
|
|
Does marker-based image segmentation using watershed algrorithm
|
|
|
|
:param image: The input 8-bit 3-channel image.
|
|
|
|
:param markers: The 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, user has to outline roughly the desired regions in the image ``markers`` with positive (
|
|
:math:`>0` ) indices, i.e. every region is
|
|
represented as one or more connected components with the pixel values
|
|
1, 2, 3 etc (such markers can be retrieved from a binary mask
|
|
using
|
|
:func:`findContours` and
|
|
:func:`drawContours` , see ``watershed.cpp`` demo).
|
|
The markers will be "seeds" of the future image
|
|
regions. All the other pixels in ``markers`` , which relation to the
|
|
outlined regions is not known and should be defined by the algorithm,
|
|
should be set to 0's. On the output of the function, each pixel in
|
|
markers is set to one of values of the "seed" components, or to -1 at
|
|
boundaries between the regions.
|
|
|
|
Note, that it is not necessary that every two neighbor connected
|
|
components are separated by a watershed boundary (-1's pixels), for
|
|
example, in case when such tangent components exist in the initial
|
|
marker image. Visual demonstration and usage example of the function
|
|
can be found in OpenCV samples directory; see ``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 GrabCut algorithm
|
|
|
|
:param image: The input 8-bit 3-channel image.
|
|
|
|
:param mask: The input/output 8-bit single-channel mask. Its elements may have one of four values. The mask is initialize when ``mode==GC_INIT_WITH_RECT``
|
|
* **GC_BGD** Certainly a background pixel
|
|
|
|
* **GC_FGD** Certainly a foreground (object) pixel
|
|
|
|
* **GC_PR_BGD** Likely a background pixel
|
|
|
|
* **GC_PR_BGD** Likely a foreground pixel
|
|
|
|
:param rect: The ROI containing the segmented object. The pixels outside of the ROI are marked as "certainly a 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: The number of iterations the algorithm should do before returning the result. Note that the result can be refined with further calls with the ``mode==GC_INIT_WITH_MASK`` or ``mode==GC_EVAL``
|
|
|
|
:param mode: The operation mode
|
|
|
|
* **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 on how to use the function.
|