How to compute the aspect ratio of an object in an image using OpenCV Python?


The aspect ratio of an object is computed as the ratio between the width and height of the bounding rectangle of the object. So, to compute the aspect ratio, we first have to find the bounding rectangle of the object. Bounding rectangle of an object can be found using cv2.boundingRect() function.

It accepts the contour points of the object and returns top-left coordinate (x,y) and (width, height) of the bounding rectangle. We use the width and height to compute the aspect ratio.

Syntax

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

Here, "cnt" is a numpy array of the contour points of an object in the image.

Steps

You can use the following steps to compute aspect ratio of an object in an image −

Import the required library. In all the following Python examples, the required Python library is OpenCV. Make sure you have already installed it.

import cv2

Read the input image using cv2.imread() and convert it to grayscale.

img = cv2.imread('fourpoint-star.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Apply thresholding on the grayscale image to create a binary image. Adjust the second argument for better detection of contour.

ret,thresh = cv2.threshold(gray,150,255,0)

Find the contours in the image using cv2.findContours() function.

contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

Select a contour cnt or loop over all contours. Compute the aspect ratio using width and height of the bounding rectangle of the object.

cnt = contours[0]
x, y, w, h = cv2.boundingRect(cnt)
ar = float(w)/h

Optionally you can draw the contours and bounding rectangle on the input image. Also put the aspect ratio as text on the image

cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

Print the aspect ratio and display the image with the drawn contours, bounding rectangle.

print("Aspect Ratio of object: ", ar)
cv2.imshow("Aspect Ratio", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Let's have a look at some examples for more clear understanding.

Example 1

In this Python program, we compute the aspect ratio of an object in the image. We draw the contour and bounding rectangle for the object on the image. We also put the aspect ratio as text for the object.

# import required libraries import cv2 # load the input image img = cv2.imread('fourpoint-star.png') # convert the image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # apply thresholding to convert grayscale to binary image ret,thresh = cv2.threshold(gray,150,255,0) # find the contours contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) print("Number of objects detected:", len(contours)) # define function to compute aspect ratio def aspect_ratio(cnt): x, y, w, h = cv2.boundingRect(cnt) ratio = float(w)/h return ratio # select first contour cnt = contours[0] # find the aspect ratio ar = aspect_ratio(cnt) # round it to two decimal points ar = round(ar, 2) # draw contours cv2.drawContours(img,[cnt],0,(0,255,0),2) # draw bounding rectangle x,y,w,h = cv2.boundingRect(cnt) cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # put text on the image cv2.putText(img, f'Aspect Ratio={ar}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) print(f"Aspect Ratio of object 1 =", ar) cv2.imshow("Aspect Ratio", img) cv2.waitKey(0) cv2.destroyAllWindows()

We will use the following image as the Input File in this program −

Output

When we execute the above code, it will produce the following output

Number of objects detected: 1 
Aspect Ratio of object 1 = 1.71

And, we get the following output window −

The contour is drawn in green color and the bounding rectangle in blue color. The aspect ratio of the detected object is written in white color.

Example 2

In this Python program, we compute the aspect ratio of all the objects in the image. We draw all the contours and bounding rectangles on the image. We also put the aspect ratio as text for all objects.

import cv2 import numpy as np img = cv2.imread('shapes2.png') img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(img1,40,255,0) contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) print("Number of objects detected:", len(contours)) def aspect_ratio(cnt): x, y, w, h = cv2.boundingRect(cnt) ratio = float(w)/h return ratio # loop over all the contours for i, cnt in enumerate(contours): ar = aspect_ratio(cnt) ar = round(ar, 3) x,y,w,h = cv2.boundingRect(cnt) cv2.drawContours(img,[cnt],0,(0,255,0),2) cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) cv2.putText(img, f'{ar}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) print(f"Aspect Ratio of object {i+1} =", ar) cv2.imshow("Aspect Ratio", img) cv2.waitKey(0) cv2.destroyAllWindows()

We will use the following image as the Input File in this program −

Output

When we execute the above code, it will produce the following output

Number of objects detected: 7 
Aspect Ratio of object 1 = 1.662 
Aspect Ratio of object 2 = 0.657 
Aspect Ratio of object 3 = 0.705 
Aspect Ratio of object 4 = 0.912 
Aspect Ratio of object 5 = 0.94 
Aspect Ratio of object 6 = 1.054 
Aspect Ratio of object 7 = 1.845

And we get the following output window −

The contour is drawn in green color and the bounding rectangle in blue color. The aspect ratio of the detected objects is written in red color.

Updated on: 28-Sep-2022

3K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements