OpenCV
3.3.0-dev
Open Source Computer Vision
|
In this tutorial you will learn how to find a given configuration or pattern in a binary image by using the Hit-or-Miss transform (also known as Hit-and-Miss transform). This transform is also the basis of more advanced morphological operations such as thinning or pruning.
We will use the OpenCV function cv::morphologyEx.
Morphological operators process images based on their shape. These operators apply one or more structuring elements to an input image to obtain the output image. The two basic morphological operations are the erosion and the dilation. The combination of these two operations generate advanced morphological transformations such as opening, closing, or top-hat transform. To know more about these and other basic morphological operations refer to previous tutorials here and here.
The Hit-or-Miss transformation is useful to find patterns in binary images. In particular, it finds those pixels whose neighbourhood matches the shape of a first structuring element \(B_1\) while not matching the shape of a second structuring element \(B_2\) at the same time. Mathematically, the operation applied to an image \(A\) can be expressed as follows:
\[ A\circledast B = (A\ominus B_1) \cap (A^c\ominus B_2) \]
Therefore, the hit-or-miss operation comprises three steps:
The structuring elements \(B_1\) and \(B_2\) can be combined into a single element \(B\). Let's see an example:
In this case, we are looking for a pattern in which the central pixel belongs to the background while the north, south, east, and west pixels belong to the foreground. The rest of pixels in the neighbourhood can be of any kind, we don't care about them. Now, let's apply this kernel to an input image:
You can see that the pattern is found in just one location within the image.
The code corresponding to the previous example is shown below. You can also download it from here
As you can see, it is as simple as using the function cv::morphologyEx with the operation type cv::MORPH_HITMISS and the chosen kernel.
Here you can find the output results of applying different kernels to the same input image used before:
Now try your own patterns!