mirror of
https://github.com/opencv/opencv.git
synced 2024-11-26 12:10:49 +08:00
Merge pull request #186 from vpisarev:doc_fixes_master
This commit is contained in:
commit
61a40ddff8
@ -31,15 +31,15 @@ Point
|
|||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
Point pt;
|
Point pt;
|
||||||
pt.x = 10;
|
pt.x = 10;
|
||||||
pt.y = 8;
|
pt.y = 8;
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
Point pt = Point(10, 8);
|
Point pt = Point(10, 8);
|
||||||
|
|
||||||
Scalar
|
Scalar
|
||||||
-------
|
-------
|
||||||
@ -49,7 +49,7 @@ Scalar
|
|||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
Scalar( a, b, c )
|
Scalar( a, b, c )
|
||||||
|
|
||||||
We would be defining a RGB color such as: *Red = c*, *Green = b* and *Blue = a*
|
We would be defining a RGB color such as: *Red = c*, *Green = b* and *Blue = a*
|
||||||
|
|
||||||
@ -65,51 +65,51 @@ Explanation
|
|||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
/// Windows names
|
/// Windows names
|
||||||
char atom_window[] = "Drawing 1: Atom";
|
char atom_window[] = "Drawing 1: Atom";
|
||||||
char rook_window[] = "Drawing 2: Rook";
|
char rook_window[] = "Drawing 2: Rook";
|
||||||
|
|
||||||
/// Create black empty images
|
/// Create black empty images
|
||||||
Mat atom_image = Mat::zeros( w, w, CV_8UC3 );
|
Mat atom_image = Mat::zeros( w, w, CV_8UC3 );
|
||||||
Mat rook_image = Mat::zeros( w, w, CV_8UC3 );
|
Mat rook_image = Mat::zeros( w, w, CV_8UC3 );
|
||||||
|
|
||||||
#. We created functions to draw different geometric shapes. For instance, to draw the atom we used *MyEllipse* and *MyFilledCircle*:
|
#. We created functions to draw different geometric shapes. For instance, to draw the atom we used *MyEllipse* and *MyFilledCircle*:
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
/// 1. Draw a simple atom:
|
/// 1. Draw a simple atom:
|
||||||
|
|
||||||
/// 1.a. Creating ellipses
|
/// 1.a. Creating ellipses
|
||||||
MyEllipse( atom_image, 90 );
|
MyEllipse( atom_image, 90 );
|
||||||
MyEllipse( atom_image, 0 );
|
MyEllipse( atom_image, 0 );
|
||||||
MyEllipse( atom_image, 45 );
|
MyEllipse( atom_image, 45 );
|
||||||
MyEllipse( atom_image, -45 );
|
MyEllipse( atom_image, -45 );
|
||||||
|
|
||||||
/// 1.b. Creating circles
|
/// 1.b. Creating circles
|
||||||
MyFilledCircle( atom_image, Point( w/2.0, w/2.0) );
|
MyFilledCircle( atom_image, Point( w/2.0, w/2.0) );
|
||||||
|
|
||||||
#. And to draw the rook we employed *MyLine*, *rectangle* and a *MyPolygon*:
|
#. And to draw the rook we employed *MyLine*, *rectangle* and a *MyPolygon*:
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
/// 2. Draw a rook
|
/// 2. Draw a rook
|
||||||
|
|
||||||
/// 2.a. Create a convex polygon
|
/// 2.a. Create a convex polygon
|
||||||
MyPolygon( rook_image );
|
MyPolygon( rook_image );
|
||||||
|
|
||||||
/// 2.b. Creating rectangles
|
/// 2.b. Creating rectangles
|
||||||
rectangle( rook_image,
|
rectangle( rook_image,
|
||||||
Point( 0, 7*w/8.0 ),
|
Point( 0, 7*w/8.0 ),
|
||||||
Point( w, w),
|
Point( w, w),
|
||||||
Scalar( 0, 255, 255 ),
|
Scalar( 0, 255, 255 ),
|
||||||
-1,
|
-1,
|
||||||
8 );
|
8 );
|
||||||
|
|
||||||
/// 2.c. Create a few lines
|
/// 2.c. Create a few lines
|
||||||
MyLine( rook_image, Point( 0, 15*w/16 ), Point( w, 15*w/16 ) );
|
MyLine( rook_image, Point( 0, 15*w/16 ), Point( w, 15*w/16 ) );
|
||||||
MyLine( rook_image, Point( w/4, 7*w/8 ), Point( w/4, w ) );
|
MyLine( rook_image, Point( w/4, 7*w/8 ), Point( w/4, w ) );
|
||||||
MyLine( rook_image, Point( w/2, 7*w/8 ), Point( w/2, w ) );
|
MyLine( rook_image, Point( w/2, 7*w/8 ), Point( w/2, w ) );
|
||||||
MyLine( rook_image, Point( 3*w/4, 7*w/8 ), Point( 3*w/4, w ) );
|
MyLine( rook_image, Point( 3*w/4, 7*w/8 ), Point( 3*w/4, w ) );
|
||||||
|
|
||||||
#. Let's check what is inside each of these functions:
|
#. Let's check what is inside each of these functions:
|
||||||
|
|
||||||
@ -117,17 +117,15 @@ Explanation
|
|||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
void MyLine( Mat img, Point start, Point end )
|
void MyLine( Mat img, Point start, Point end )
|
||||||
{
|
{
|
||||||
int thickness = 2;
|
int thickness = 2;
|
||||||
int lineType = 8;
|
int lineType = 8;
|
||||||
line( img,
|
line( img, start, end,
|
||||||
start,
|
Scalar( 0, 0, 0 ),
|
||||||
end,
|
thickness,
|
||||||
Scalar( 0, 0, 0 ),
|
lineType );
|
||||||
thickness,
|
}
|
||||||
lineType );
|
|
||||||
}
|
|
||||||
|
|
||||||
As we can see, *MyLine* just call the function :line:`line <>`, which does the following:
|
As we can see, *MyLine* just call the function :line:`line <>`, which does the following:
|
||||||
|
|
||||||
@ -143,32 +141,32 @@ Explanation
|
|||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
void MyEllipse( Mat img, double angle )
|
void MyEllipse( Mat img, double angle )
|
||||||
{
|
{
|
||||||
int thickness = 2;
|
int thickness = 2;
|
||||||
int lineType = 8;
|
int lineType = 8;
|
||||||
|
|
||||||
ellipse( img,
|
ellipse( img,
|
||||||
Point( w/2.0, w/2.0 ),
|
Point( w/2.0, w/2.0 ),
|
||||||
Size( w/4.0, w/16.0 ),
|
Size( w/4.0, w/16.0 ),
|
||||||
angle,
|
angle,
|
||||||
0,
|
0,
|
||||||
360,
|
360,
|
||||||
Scalar( 255, 0, 0 ),
|
Scalar( 255, 0, 0 ),
|
||||||
thickness,
|
thickness,
|
||||||
lineType );
|
lineType );
|
||||||
}
|
}
|
||||||
|
|
||||||
From the code above, we can observe that the function :ellipse:`ellipse <>` draws an ellipse such that:
|
From the code above, we can observe that the function :ellipse:`ellipse <>` draws an ellipse such that:
|
||||||
|
|
||||||
.. container:: enumeratevisibleitemswithsquare
|
.. container:: enumeratevisibleitemswithsquare
|
||||||
|
|
||||||
* The ellipse is displayed in the image **img**
|
* The ellipse is displayed in the image **img**
|
||||||
* The ellipse center is located in the point **(w/2.0, w/2.0)** and is enclosed in a box of size **(w/4.0, w/16.0)**
|
* The ellipse center is located in the point **(w/2.0, w/2.0)** and is enclosed in a box of size **(w/4.0, w/16.0)**
|
||||||
* The ellipse is rotated **angle** degrees
|
* The ellipse is rotated **angle** degrees
|
||||||
* The ellipse extends an arc between **0** and **360** degrees
|
* The ellipse extends an arc between **0** and **360** degrees
|
||||||
* The color of the figure will be **Scalar( 255, 255, 0)** which means blue in RGB value.
|
* The color of the figure will be **Scalar( 255, 255, 0)** which means blue in RGB value.
|
||||||
* The ellipse's **thickness** is 2.
|
* The ellipse's **thickness** is 2.
|
||||||
|
|
||||||
|
|
||||||
* *MyFilledCircle*
|
* *MyFilledCircle*
|
||||||
@ -176,17 +174,17 @@ Explanation
|
|||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
void MyFilledCircle( Mat img, Point center )
|
void MyFilledCircle( Mat img, Point center )
|
||||||
{
|
{
|
||||||
int thickness = -1;
|
int thickness = -1;
|
||||||
int lineType = 8;
|
int lineType = 8;
|
||||||
|
|
||||||
circle( img,
|
circle( img,
|
||||||
center,
|
center,
|
||||||
w/32.0,
|
w/32.0,
|
||||||
Scalar( 0, 0, 255 ),
|
Scalar( 0, 0, 255 ),
|
||||||
thickness,
|
thickness,
|
||||||
lineType );
|
lineType );
|
||||||
}
|
}
|
||||||
|
|
||||||
Similar to the ellipse function, we can observe that *circle* receives as arguments:
|
Similar to the ellipse function, we can observe that *circle* receives as arguments:
|
||||||
|
|
||||||
@ -202,43 +200,43 @@ Explanation
|
|||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
void MyPolygon( Mat img )
|
void MyPolygon( Mat img )
|
||||||
{
|
{
|
||||||
int lineType = 8;
|
int lineType = 8;
|
||||||
|
|
||||||
/** Create some points */
|
/** Create some points */
|
||||||
Point rook_points[1][20];
|
Point rook_points[1][20];
|
||||||
rook_points[0][0] = Point( w/4.0, 7*w/8.0 );
|
rook_points[0][0] = Point( w/4.0, 7*w/8.0 );
|
||||||
rook_points[0][1] = Point( 3*w/4.0, 7*w/8.0 );
|
rook_points[0][1] = Point( 3*w/4.0, 7*w/8.0 );
|
||||||
rook_points[0][2] = Point( 3*w/4.0, 13*w/16.0 );
|
rook_points[0][2] = Point( 3*w/4.0, 13*w/16.0 );
|
||||||
rook_points[0][3] = Point( 11*w/16.0, 13*w/16.0 );
|
rook_points[0][3] = Point( 11*w/16.0, 13*w/16.0 );
|
||||||
rook_points[0][4] = Point( 19*w/32.0, 3*w/8.0 );
|
rook_points[0][4] = Point( 19*w/32.0, 3*w/8.0 );
|
||||||
rook_points[0][5] = Point( 3*w/4.0, 3*w/8.0 );
|
rook_points[0][5] = Point( 3*w/4.0, 3*w/8.0 );
|
||||||
rook_points[0][6] = Point( 3*w/4.0, w/8.0 );
|
rook_points[0][6] = Point( 3*w/4.0, w/8.0 );
|
||||||
rook_points[0][7] = Point( 26*w/40.0, w/8.0 );
|
rook_points[0][7] = Point( 26*w/40.0, w/8.0 );
|
||||||
rook_points[0][8] = Point( 26*w/40.0, w/4.0 );
|
rook_points[0][8] = Point( 26*w/40.0, w/4.0 );
|
||||||
rook_points[0][9] = Point( 22*w/40.0, w/4.0 );
|
rook_points[0][9] = Point( 22*w/40.0, w/4.0 );
|
||||||
rook_points[0][10] = Point( 22*w/40.0, w/8.0 );
|
rook_points[0][10] = Point( 22*w/40.0, w/8.0 );
|
||||||
rook_points[0][11] = Point( 18*w/40.0, w/8.0 );
|
rook_points[0][11] = Point( 18*w/40.0, w/8.0 );
|
||||||
rook_points[0][12] = Point( 18*w/40.0, w/4.0 );
|
rook_points[0][12] = Point( 18*w/40.0, w/4.0 );
|
||||||
rook_points[0][13] = Point( 14*w/40.0, w/4.0 );
|
rook_points[0][13] = Point( 14*w/40.0, w/4.0 );
|
||||||
rook_points[0][14] = Point( 14*w/40.0, w/8.0 );
|
rook_points[0][14] = Point( 14*w/40.0, w/8.0 );
|
||||||
rook_points[0][15] = Point( w/4.0, w/8.0 );
|
rook_points[0][15] = Point( w/4.0, w/8.0 );
|
||||||
rook_points[0][16] = Point( w/4.0, 3*w/8.0 );
|
rook_points[0][16] = Point( w/4.0, 3*w/8.0 );
|
||||||
rook_points[0][17] = Point( 13*w/32.0, 3*w/8.0 );
|
rook_points[0][17] = Point( 13*w/32.0, 3*w/8.0 );
|
||||||
rook_points[0][18] = Point( 5*w/16.0, 13*w/16.0 );
|
rook_points[0][18] = Point( 5*w/16.0, 13*w/16.0 );
|
||||||
rook_points[0][19] = Point( w/4.0, 13*w/16.0) ;
|
rook_points[0][19] = Point( w/4.0, 13*w/16.0) ;
|
||||||
|
|
||||||
const Point* ppt[1] = { rook_points[0] };
|
const Point* ppt[1] = { rook_points[0] };
|
||||||
int npt[] = { 20 };
|
int npt[] = { 20 };
|
||||||
|
|
||||||
fillPoly( img,
|
fillPoly( img,
|
||||||
ppt,
|
ppt,
|
||||||
npt,
|
npt,
|
||||||
1,
|
1,
|
||||||
Scalar( 255, 255, 255 ),
|
Scalar( 255, 255, 255 ),
|
||||||
lineType );
|
lineType );
|
||||||
}
|
}
|
||||||
|
|
||||||
To draw a filled polygon we use the function :fill_poly:`fillPoly <>`. We note that:
|
To draw a filled polygon we use the function :fill_poly:`fillPoly <>`. We note that:
|
||||||
|
|
||||||
@ -254,12 +252,11 @@ Explanation
|
|||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
rectangle( rook_image,
|
rectangle( rook_image,
|
||||||
Point( 0, 7*w/8.0 ),
|
Point( 0, 7*w/8.0 ),
|
||||||
Point( w, w),
|
Point( w, w),
|
||||||
Scalar( 0, 255, 255 ),
|
Scalar( 0, 255, 255 ),
|
||||||
-1,
|
-1, 8 );
|
||||||
8 );
|
|
||||||
|
|
||||||
Finally we have the :rectangle:`rectangle <>` function (we did not create a special function for this guy). We note that:
|
Finally we have the :rectangle:`rectangle <>` function (we did not create a special function for this guy). We note that:
|
||||||
|
|
||||||
|
@ -11,17 +11,15 @@ In this tutorial you will learn how to:
|
|||||||
.. container:: enumeratevisibleitemswithsquare
|
.. container:: enumeratevisibleitemswithsquare
|
||||||
|
|
||||||
+ Access pixel values
|
+ Access pixel values
|
||||||
|
|
||||||
+ Initialize a matrix with zeros
|
+ Initialize a matrix with zeros
|
||||||
|
|
||||||
+ Learn what :saturate_cast:`saturate_cast <>` does and why it is useful
|
+ Learn what :saturate_cast:`saturate_cast <>` does and why it is useful
|
||||||
|
|
||||||
+ Get some cool info about pixel transformations
|
+ Get some cool info about pixel transformations
|
||||||
|
|
||||||
Theory
|
Theory
|
||||||
=======
|
=======
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
The explanation below belongs to the book `Computer Vision: Algorithms and Applications <http://szeliski.org/Book/>`_ by Richard Szeliski
|
The explanation below belongs to the book `Computer Vision: Algorithms and Applications <http://szeliski.org/Book/>`_ by Richard Szeliski
|
||||||
|
|
||||||
Image Processing
|
Image Processing
|
||||||
@ -38,7 +36,7 @@ Image Processing
|
|||||||
|
|
||||||
|
|
||||||
Pixel Transforms
|
Pixel Transforms
|
||||||
^^^^^^^^^^^^^^^^^
|
-----------------
|
||||||
|
|
||||||
.. container:: enumeratevisibleitemswithsquare
|
.. container:: enumeratevisibleitemswithsquare
|
||||||
|
|
||||||
@ -47,7 +45,7 @@ Pixel Transforms
|
|||||||
* Examples of such operators include *brightness and contrast adjustments* as well as color correction and transformations.
|
* Examples of such operators include *brightness and contrast adjustments* as well as color correction and transformations.
|
||||||
|
|
||||||
Brightness and contrast adjustments
|
Brightness and contrast adjustments
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
------------------------------------
|
||||||
|
|
||||||
.. container:: enumeratevisibleitemswithsquare
|
.. container:: enumeratevisibleitemswithsquare
|
||||||
|
|
||||||
@ -70,9 +68,7 @@ Brightness and contrast adjustments
|
|||||||
Code
|
Code
|
||||||
=====
|
=====
|
||||||
|
|
||||||
.. container:: enumeratevisibleitemswithsquare
|
* The following code performs the operation :math:`g(i,j) = \alpha \cdot f(i,j) + \beta` :
|
||||||
|
|
||||||
* The following code performs the operation :math:`g(i,j) = \alpha \cdot f(i,j) + \beta` :
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
@ -87,38 +83,37 @@ Code
|
|||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
/// Read image given by user
|
/// Read image given by user
|
||||||
Mat image = imread( argv[1] );
|
Mat image = imread( argv[1] );
|
||||||
Mat new_image = Mat::zeros( image.size(), image.type() );
|
Mat new_image = Mat::zeros( image.size(), image.type() );
|
||||||
|
|
||||||
/// Initialize values
|
/// Initialize values
|
||||||
std::cout<<" Basic Linear Transforms "<<std::endl;
|
std::cout<<" Basic Linear Transforms "<<std::endl;
|
||||||
std::cout<<"-------------------------"<<std::endl;
|
std::cout<<"-------------------------"<<std::endl;
|
||||||
std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
|
std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
|
||||||
std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;
|
std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;
|
||||||
|
|
||||||
/// Do the operation new_image(i,j) = alpha*image(i,j) + beta
|
/// Do the operation new_image(i,j) = alpha*image(i,j) + beta
|
||||||
for( int y = 0; y < image.rows; y++ )
|
for( int y = 0; y < image.rows; y++ ) {
|
||||||
{ for( int x = 0; x < image.cols; x++ )
|
for( int x = 0; x < image.cols; x++ ) {
|
||||||
{ for( int c = 0; c < 3; c++ )
|
for( int c = 0; c < 3; c++ ) {
|
||||||
{
|
new_image.at<Vec3b>(y,x)[c] =
|
||||||
new_image.at<Vec3b>(y,x)[c] =
|
saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
|
||||||
saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create Windows
|
/// Create Windows
|
||||||
namedWindow("Original Image", 1);
|
namedWindow("Original Image", 1);
|
||||||
namedWindow("New Image", 1);
|
namedWindow("New Image", 1);
|
||||||
|
|
||||||
/// Show stuff
|
/// Show stuff
|
||||||
imshow("Original Image", image);
|
imshow("Original Image", image);
|
||||||
imshow("New Image", new_image);
|
imshow("New Image", new_image);
|
||||||
|
|
||||||
/// Wait until user press some key
|
/// Wait until user press some key
|
||||||
waitKey();
|
waitKey();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Explanation
|
Explanation
|
||||||
@ -155,13 +150,14 @@ Explanation
|
|||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
for( int y = 0; y < image.rows; y++ )
|
for( int y = 0; y < image.rows; y++ ) {
|
||||||
{ for( int x = 0; x < image.cols; x++ )
|
for( int x = 0; x < image.cols; x++ ) {
|
||||||
{ for( int c = 0; c < 3; c++ )
|
for( int c = 0; c < 3; c++ ) {
|
||||||
{ new_image.at<Vec3b>(y,x)[c] =
|
new_image.at<Vec3b>(y,x)[c] =
|
||||||
saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta ); }
|
saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Notice the following:
|
Notice the following:
|
||||||
|
|
||||||
@ -209,6 +205,6 @@ Result
|
|||||||
|
|
||||||
* We get this:
|
* We get this:
|
||||||
|
|
||||||
.. image:: images/Basic_Linear_Transform_Tutorial_Result_0.jpg
|
.. image:: images/Basic_Linear_Transform_Tutorial_Result_0.jpg
|
||||||
:alt: Basic Linear Transform - Final Result
|
:alt: Basic Linear Transform - Final Result
|
||||||
:align: center
|
:align: center
|
||||||
|
@ -39,7 +39,7 @@ Morphological Operations
|
|||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
Dilation
|
Dilation
|
||||||
^^^^^^^^^
|
~~~~~~~~
|
||||||
|
|
||||||
* This operations consists of convoluting an image :math:`A` with some kernel (:math:`B`), which can have any shape or size, usually a square or circle.
|
* This operations consists of convoluting an image :math:`A` with some kernel (:math:`B`), which can have any shape or size, usually a square or circle.
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ Dilation
|
|||||||
The background (bright) dilates around the black regions of the letter.
|
The background (bright) dilates around the black regions of the letter.
|
||||||
|
|
||||||
Erosion
|
Erosion
|
||||||
^^^^^^^^
|
~~~~~~~
|
||||||
|
|
||||||
* This operation is the sister of dilation. What this does is to compute a local minimum over the area of the kernel.
|
* This operation is the sister of dilation. What this does is to compute a local minimum over the area of the kernel.
|
||||||
|
|
||||||
@ -216,17 +216,17 @@ Explanation
|
|||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
Mat element = getStructuringElement( erosion_type,
|
Mat element = getStructuringElement( erosion_type,
|
||||||
Size( 2*erosion_size + 1, 2*erosion_size+1 ),
|
Size( 2*erosion_size + 1, 2*erosion_size+1 ),
|
||||||
Point( erosion_size, erosion_size ) );
|
Point( erosion_size, erosion_size ) );
|
||||||
|
|
||||||
We can choose any of three shapes for our kernel:
|
We can choose any of three shapes for our kernel:
|
||||||
|
|
||||||
.. container:: enumeratevisibleitemswithsquare
|
.. container:: enumeratevisibleitemswithsquare
|
||||||
|
|
||||||
+ Rectangular box: MORPH_RECT
|
+ Rectangular box: MORPH_RECT
|
||||||
+ Cross: MORPH_CROSS
|
+ Cross: MORPH_CROSS
|
||||||
+ Ellipse: MORPH_ELLIPSE
|
+ Ellipse: MORPH_ELLIPSE
|
||||||
|
|
||||||
Then, we just have to specify the size of our kernel and the *anchor point*. If not specified, it is assumed to be in the center.
|
Then, we just have to specify the size of our kernel and the *anchor point*. If not specified, it is assumed to be in the center.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user