svn repository web references are replaced with links to git
This commit is contained in:
@@ -13,7 +13,7 @@ In this tutorial you will learn how to:
|
||||
* Use the OpenCV function :split:`split <>` to divide an image into its correspondent planes.
|
||||
|
||||
* To calculate histograms of arrays of images by using the OpenCV function :calc_hist:`calcHist <>`
|
||||
|
||||
|
||||
* To normalize an array by using the function :normalize:`normalize <>`
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ What are histograms?
|
||||
|
||||
|
||||
.. image:: images/Histogram_Calculation_Theory_Hist0.jpg
|
||||
:align: center
|
||||
:align: center
|
||||
|
||||
* What happens if we want to *count* this data in an organized way? Since we know that the *range* of information value for this case is 256 values, we can segment our range in subparts (called **bins**) like:
|
||||
|
||||
@@ -42,22 +42,22 @@ What are histograms?
|
||||
\begin{array}{l}
|
||||
[0, 255] = { [0, 15] \cup [16, 31] \cup ....\cup [240,255] } \\
|
||||
range = { bin_{1} \cup bin_{2} \cup ....\cup bin_{n = 15} }
|
||||
\end{array}
|
||||
\end{array}
|
||||
|
||||
and we can keep count of the number of pixels that fall in the range of each :math:`bin_{i}`. Applying this to the example above we get the image below ( axis x represents the bins and axis y the number of pixels in each of them).
|
||||
|
||||
|
||||
|
||||
.. image:: images/Histogram_Calculation_Theory_Hist1.jpg
|
||||
:align: center
|
||||
:align: center
|
||||
|
||||
* This was just a simple example of how an histogram works and why it is useful. An histogram can keep count not only of color intensities, but of whatever image features that we want to measure (i.e. gradients, directions, etc).
|
||||
|
||||
* This was just a simple example of how an histogram works and why it is useful. An histogram can keep count not only of color intensities, but of whatever image features that we want to measure (i.e. gradients, directions, etc).
|
||||
|
||||
* Let's identify some parts of the histogram:
|
||||
|
||||
a. **dims**: The number of parameters you want to collect data of. In our example, **dims = 1** because we are only counting the intensity values of each pixel (in a greyscale image).
|
||||
b. **bins**: It is the number of **subdivisions** in each dim. In our example, **bins = 16**
|
||||
c. **range**: The limits for the values to be measured. In this case: **range = [0,255]**
|
||||
|
||||
c. **range**: The limits for the values to be measured. In this case: **range = [0,255]**
|
||||
|
||||
* What if you want to count two features? In this case your resulting histogram would be a 3D plot (in which x and y would be :math:`bin_{x}` and :math:`bin_{y}` for each feature and z would be the number of counts for each combination of :math:`(bin_{x}, bin_{y})`. The same would apply for more features (of course it gets trickier).
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ What OpenCV offers you
|
||||
-----------------------
|
||||
|
||||
For simple purposes, OpenCV implements the function :calc_hist:`calcHist <>`, which calculates the histogram of a set of arrays (usually images or image planes). It can operate with up to 32 dimensions. We will see it in the code below!
|
||||
|
||||
|
||||
|
||||
Code
|
||||
====
|
||||
@@ -73,7 +73,7 @@ Code
|
||||
.. container:: enumeratevisibleitemswithsquare
|
||||
|
||||
* **What does this program do?**
|
||||
|
||||
|
||||
.. container:: enumeratevisibleitemswithsquare
|
||||
|
||||
* Loads an image
|
||||
@@ -82,7 +82,7 @@ Code
|
||||
* Plot the three histograms in a window
|
||||
|
||||
* **Downloadable code**:
|
||||
Click `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/Histograms_Matching/calcHist_Demo.cpp>`_
|
||||
Click `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/Histograms_Matching/calcHist_Demo.cpp>`_
|
||||
|
||||
* **Code at glance:**
|
||||
|
||||
@@ -181,7 +181,7 @@ Explanation
|
||||
if( !src.data )
|
||||
{ return -1; }
|
||||
|
||||
#. Separate the source image in its three R,G and B planes. For this we use the OpenCV function :split:`split <>`:
|
||||
#. Separate the source image in its three R,G and B planes. For this we use the OpenCV function :split:`split <>`:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
@@ -195,7 +195,7 @@ Explanation
|
||||
a. Establish number of bins (5, 10...):
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
|
||||
int histSize = 256; //from 0 to 255
|
||||
|
||||
b. Set the range of values (as we said, between 0 and 255 )
|
||||
@@ -219,25 +219,25 @@ Explanation
|
||||
Mat b_hist, g_hist, r_hist;
|
||||
|
||||
e. We proceed to calculate the histograms by using the OpenCV function :calc_hist:`calcHist <>`:
|
||||
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
/// Compute the histograms:
|
||||
calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate );
|
||||
calcHist( &bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate );
|
||||
calcHist( &bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
|
||||
|
||||
|
||||
where the arguments are:
|
||||
|
||||
.. container:: enumeratevisibleitemswithsquare
|
||||
|
||||
|
||||
+ **&bgr_planes[0]:** The source array(s)
|
||||
+ **1**: The number of source arrays (in this case we are using 1. We can enter here also a list of arrays )
|
||||
+ **0**: The channel (*dim*) to be measured. In this case it is just the intensity (each array is single-channel) so we just write 0.
|
||||
+ **Mat()**: A mask to be used on the source array ( zeros indicating pixels to be ignored ). If not defined it is not used
|
||||
+ **b_hist**: The Mat object where the histogram will be stored
|
||||
+ **1**: The histogram dimensionality.
|
||||
+ **histSize:** The number of bins per each used dimension
|
||||
+ **1**: The histogram dimensionality.
|
||||
+ **histSize:** The number of bins per each used dimension
|
||||
+ **histRange:** The range of values to be measured per each dimension
|
||||
+ **uniform** and **accumulate**: The bin sizes are the same and the histogram is cleared at the beginning.
|
||||
|
||||
@@ -264,7 +264,7 @@ Explanation
|
||||
this function receives these arguments:
|
||||
|
||||
.. container:: enumeratevisibleitemswithsquare
|
||||
|
||||
|
||||
+ **b_hist:** Input array
|
||||
+ **b_hist:** Output normalized array (can be the same)
|
||||
+ **0** and**histImage.rows**: For this example, they are the lower and upper limits to normalize the values of **r_hist**
|
||||
@@ -291,7 +291,7 @@ Explanation
|
||||
}
|
||||
|
||||
|
||||
we use the expression:
|
||||
we use the expression:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
@@ -315,7 +315,7 @@ Explanation
|
||||
waitKey(0);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
|
||||
Result
|
||||
======
|
||||
@@ -323,10 +323,10 @@ Result
|
||||
#. Using as input argument an image like the shown below:
|
||||
|
||||
.. image:: images/Histogram_Calculation_Original_Image.jpg
|
||||
:align: center
|
||||
:align: center
|
||||
|
||||
#. Produces the following histogram:
|
||||
|
||||
.. image:: images/Histogram_Calculation_Result.jpg
|
||||
:align: center
|
||||
:align: center
|
||||
|
||||
|
Reference in New Issue
Block a user