· Hakan Çelik · OpenCV / Advanced Topics · 3 dk okuma

Contour Properties

Learn to extract frequently used properties of objects like Solidity, Equivalent Diameter, Mask image, Mean Intensity. Also covers extreme points, aspect ratio, and more.

Contour Properties

Here we will learn to extract some frequently used properties of objects like Solidity, Equivalent Diameter, Mask image, Mean Intensity etc.

NB: Centroid, Area, Perimeter etc also belong to this category, but we have seen it in last chapter.

1. Aspect Ratio

It is the ratio of width to height of bounding rect of the object:

Aspect Ratio = Width / Height

x, y, w, h = cv.boundingRect(cnt)
aspect_ratio = float(w) / h

2. Extent

Extent is the ratio of contour area to bounding rectangle area:

Extent = Object Area / Bounding Rectangle Area

area = cv.contourArea(cnt)
x, y, w, h = cv.boundingRect(cnt)
rect_area = w * h
extent = float(area) / rect_area

3. Solidity

Solidity is the ratio of contour area to its convex hull area:

Solidity = Contour Area / Convex Hull Area

area = cv.contourArea(cnt)
hull = cv.convexHull(cnt)
hull_area = cv.contourArea(hull)
solidity = float(area) / hull_area

4. Equivalent Diameter

Equivalent Diameter is the diameter of the circle whose area is same as the contour area:

Equivalent Diameter = √(4 × Contour Area / π)

area = cv.contourArea(cnt)
equi_diameter = np.sqrt(4 * area / np.pi)

5. Orientation

Orientation is the angle at which object is directed. Following method also gives the Major Axis and Minor Axis lengths:

(x, y), (MA, ma), angle = cv.fitEllipse(cnt)

6. Mask and Pixel Points

In some cases, we may need all the points which comprises that object. It can be done as follows:

mask = np.zeros(imgray.shape, np.uint8)
cv.drawContours(mask, [cnt], 0, 255, -1)
pixelpoints = np.transpose(np.nonzero(mask))
# pixelpoints = cv.findNonZero(mask)

Here, two methods, one using Numpy functions, next one using OpenCV function (last commented line) are given to do the same. Results are also same, but with a slight difference. Numpy gives coordinates in (row, column) format, while OpenCV gives coordinates in (x,y) format. So basically row = y and column = x.

7. Maximum Value, Minimum Value and their locations

We can find these parameters using a mask image:

min_val, max_val, min_loc, max_loc = cv.minMaxLoc(imgray, mask=mask)

8. Mean Color or Mean Intensity

Here, we can find the average color of an object. Or it can be average intensity of the object in grayscale mode. We again use the same mask to do it:

mean_val = cv.mean(im, mask=mask)

9. Extreme Points

Extreme Points means topmost, bottommost, rightmost and leftmost points of the object:

leftmost = tuple(cnt[cnt[:, :, 0].argmin()][0])
rightmost = tuple(cnt[cnt[:, :, 0].argmax()][0])
topmost = tuple(cnt[cnt[:, :, 1].argmin()][0])
bottommost = tuple(cnt[cnt[:, :, 1].argmax()][0])

For eg, if I apply it to an Indian map, I get the following result:

Extreme points

Exercises

  • There are still some features left in matlab regionprops doc. Try to implement them.

Source: OpenCV Python Tutorials — Original Documentation

Back to Blog

Related Posts

View All Posts »
How OpenCV-Python Bindings Work

How OpenCV-Python Bindings Work

OpenCV · 3 dk

Learn how OpenCV-Python bindings are generated from C++ headers. We cover CV_EXPORTS_W, CV_WRAP, and other macros, plus the gen2.py generator and hdr_parser.py header parser scripts.

Face Detection using Haar Cascades

Face Detection using Haar Cascades

OpenCV · 3 dk

Learn to use Haar Cascade classifiers in OpenCV for face and eye detection. This tutorial covers the theory behind Haar features, integral images, AdaBoost, and cascade classifiers.

High Dynamic Range (HDR) Imaging

High Dynamic Range (HDR) Imaging

OpenCV · 3 dk

Learn how to generate and display HDR images from an exposure sequence in OpenCV. We cover Debevec, Robertson, and Mertens exposure fusion algorithms with camera response function estimation.

Image Inpainting

Image Inpainting

OpenCV · 2 dk

Learn how to remove small noises, strokes, and damage from old photographs using OpenCV's cv.inpaint(). We cover the Telea and Navier-Stokes inpainting algorithms.