How to Extract the Foreground of an Image Using OpenCV Python?

How to Extract the Foreground of an Image Using OpenCV Python?

OpenCV is a powerful library for computer vision and image processing. It offers a vast range of functions to manipulate and analyze different types of image data with ease. In this article, we’ll look at how to extract the foreground of an image using OpenCV in Python.

Image extraction is one of the fundamental components of image processing. It involves isolating the relevant part of the image from the background. The extracted part can be edited, analyzed, or used for further processing. Foreground extraction refers to the separation of the object of interest from the rest of the image.

The Concept of Foreground Extraction

The process of foreground extraction involves defining a mask or region of interest (ROI) that highlights the object of interest. The mask can be defined manually or using algorithms that automatically detect the object of interest. Once the mask is defined, it can be used to extract the foreground.

The Approach of Foreground Extraction in OpenCV

OpenCV Python provides a function called grabCut that is used for foreground extraction. The function takes an image and a mask as input and returns a new mask with the foreground pixels marked. The foreground pixels are represented by a label of 1, while the background pixels are represented by a label of 0.

To perform foreground extraction, we need to follow these steps:

  1. Load the image
  2. Define the ROI mask
  3. Define the background and foreground model
  4. Run the grabCut function and get the result
  5. Create the final mask from the result
  6. Apply the mask to the original image to get the foreground

Step-by-Step Guide to Foreground Extraction

Let’s look at each step of the foreground extraction process in detail.

Step 1: Load the Image

The first step is to load the image from the disk using the cv2.imread() function. The function takes the path of the image file as the input and returns the image data in the form of a NumPy array. Here’s the code:

import cv2
import numpy as np

# Load the image
img = cv2.imread('image.jpg')

Step 2: Define the ROI Mask

The next step is to define the ROI mask that highlights the object of interest. There are different ways of defining the mask. We can use a rectangular ROI, a polygon-shaped ROI, or a mask image. In this example, we’ll use a rectangular ROI that covers the object in the image.

# Define the ROI mask
rect = (50, 50, 200, 200)    # (x, y, w, h)
mask = np.zeros(img.shape[:2], np.uint8)
cv2.rectangle(mask, rect, 255, -1)

Here, we define a rectangle with coordinates (50, 50) and dimensions (200, 200) using the rect variable. We then create a blank image of the same size as the input image using the np.zeros() function. The cv2.rectangle() function is used to draw the rectangle on the mask with a thickness of -1, which fills the rectangle with white color.

Step 3: Define the Background and Foreground Model

The grabCut function requires an initial background and foreground model to start the segmentation process. We define the background and foreground models using the cv2.grabCut() function.

# Define the background and foreground model
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)

# Run the grabCut function
masked_img = cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)

The bgdModel and fgdModel variables are used to store the Gaussian mixture models (GMMs) learned by the algorithm to represent the background and foreground. We initialize them as arrays of zeros with a shape of (1,65).

In the cv2.grabCut() function, we pass the input image (img), the ROI mask (mask), the rectangle defining the ROI (rect), the background and foreground models (bgdModel and fgdModel), and the number of iterations (5). The cv2.GC_INIT_WITH_RECT flag tells the function that we want to initialize the GMMs with the rectangular ROI.

The function returns a new mask with the foreground pixels labeled as 1, the background pixels labeled as 0, and the uncertain pixels labeled as 2.

Step 4: Run the grabCut function and Get the Result

Now that we have defined the models and providedthe input, we can run the cv2.grabCut() function to get the result. The function modifies the input mask and returns a new mask that separates the object from the background. Here’s the code:

# Run the grabCut function
masked_img = cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)

# Extract the result mask
mask2 = np.where((masked_img==2)|(masked_img==0), 0, 1).astype('uint8')

Here, we create a new mask called mask2 by thresholding the output of the cv2.grabCut() function. We use the np.where() function to set the uncertain and background pixels to 0 and the foreground pixels to 1. We also convert the mask to the uint8 data type for compatibility with other OpenCV functions.

Step 5: Create the Final Mask from the Result

The next step is to create the final mask that we can use to extract the foreground. We do this by multiplying the original mask with the result mask.

# Create the final mask
final_mask = mask2*255

Here, we multiply the mask2 with 255 to convert the values from 0 and 1 to 0 and 255. This creates a binary mask that highlights the object of interest.

Step 6: Apply the Mask to the Original Image to Get the Foreground

The final step is to apply the mask to the original image to get the foreground.

# Apply the mask to the original image
foreground = cv2.bitwise_and(img, img, mask=final_mask)

Here, we use the cv2.bitwise_and() function to apply the mask to the original image (img). The function sets all pixels outside the mask to 0 and retains the pixel values inside the mask to get the foreground.

Full Code Example

Here’s the full code example that puts all the above steps together:

import cv2
import numpy as np

# Load the image
img = cv2.imread('image.jpg')

# Define the ROI mask
rect = (50, 50, 200, 200)
mask = np.zeros(img.shape[:2], np.uint8)
cv2.rectangle(mask, rect, 255, -1)

# Define the background and foreground model
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)

# Run the grabCut function
masked_img = cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)

# Extract the result mask
mask2 = np.where((masked_img==2)|(masked_img==0), 0, 1).astype('uint8')

# Create the final mask
final_mask = mask2*255

# Apply the mask to the original image
foreground = cv2.bitwise_and(img, img, mask=final_mask)

# Display the result
cv2.imshow('Original Image', img)
cv2.imshow('Foreground Mask', final_mask)
cv2.imshow('Foreground', foreground)
cv2.waitKey(0)
cv2.destroyAllWindows()

Conclusion

Extracting the foreground of an image is a critical component of image processing. OpenCV Python offers a straightforward approach to this task using the grabCut function. By defining a mask or region of interest, we can extract the foreground of an image and use it for further processing or analysis.

In this article, we learned how to extract the foreground of an image using OpenCV Python. We covered the concept of foreground extraction, the approach of foreground extraction in OpenCV, and provided a step-by-step guide to the process. We also shared a full code example that you can use to test the method yourself.

Like(0)

Related

Python OpenCV
Color Identification in Images using Python and OpenCVColor quantization in an image using K-means in OpenCV PythonDetecting corners using Harris corner detector in Python OpenCVHow to Access and Modify Pixel Value in an Image Using OpenCV PythonHow to access image properties in OpenCV using Python?How to Apply Affine Transformation on an Image in OpenCV Python?How to Apply Custom Filters to Images (2D Convolution) Using OpenCV Python?How to apply Perspective Transformations on an image using OpenCV Python?How to Approximate a Contour Shape in an Image Using OpenCV PythonHow to Blend Images Using Image Pyramids in OpenCV Python?How to Blur Faces in an Image using OpenCV Python?How to Change the Contrast and Brightness of an Image Using OpenCV in PythonHow to check if an image contour is convex or not in OpenCV Python?How to Compare Histograms of Two Images Using OpenCV Python?How to compare two images in OpenCV Python?How to Compute and Plot 2D Histograms of an Image in OpenCV Python?How to Compute Hu-Moments of an Image in OpenCV Python?How to Compute Image Moments in OpenCV Python?How to Compute the Area and Perimeter of an Image Contour using OpenCV Python?How to Compute the Aspect Ratio of an Object in an Image using OpenCV Python?How to Compute the Extent of an Object in an Image using OpenCV Python?How to Compute the Morphological Gradient of an Image Using OpenCV in Python?How to Convert a Colored Image to HLS in OpenCV using Python?How to convert an RGB image to HSV image using OpenCV Python?How to create a black image and a white image using OpenCV Python?How to Create a Depth Map from Stereo Images in OpenCV Python?How to Create a Trackbar as the HSV Color Palette using OpenCV Python?How to create a trackbar as the RGB color palette using OpenCV Python?How to Create a Watermark on an Image Using OpenCV Python?How to Crop and Save Detected Faces in OpenCV Python?How to detect a face and draw a bounding box around it using OpenCV Python?Detecting Rectangles and Squares in Images with OpenCV and PythonHow to detect a triangle in an image using OpenCV Python?How to Detect and Draw FAST Feature Points in OpenCV Python?How to detect cat faces in an image in OpenCV using Python?How to detect eyes in an image using OpenCV Python?How to Detect Humans in an Image in OpenCV Python?How to Detect License Plates Using OpenCV Python?How to detect polygons in image using OpenCV Python?How to Draw an Arrowed Line on an Image in OpenCV PythonHow to Draw Filled Ellipses in OpenCV using PythonHow to draw polylines on an image in OpenCV using Python?How to Extract the Foreground of an Image Using OpenCV Python?How to find and draw Convex Hull of an image contour in OpenCV Python?How to Find Discrete Cosine Transform of an Image Using OpenCV PythonHow to Find Gaussian Pyramids for an Image Using OpenCV in Python?How to Find Image Gradients using the Scharr Operator in OpenCV Python?How to Find Laplassian Pyramids for an Image Using OpenCV in Python?How to find patterns in a chessboard using OpenCV Python?How to find the bounding rectangle of an image contour in OpenCV Python?How to find the Fourier Transform of an image using OpenCV Python?How to find the Fourier Transforms of Gaussian and Laplacian filters in OpenCV Python?How to Find the HSV values of a Color Using OpenCV Python?How to find the image gradients using Sobel and Laplacian derivatives in OpenCV Python?How to Find the Minimum Enclosing Circle of an Object in OpenCV Python?How to find the solidity and equivalent diameter of an object in an image using OpenCV Python?How to fit the ellipse to an object in an image using OpenCV Python?How to flip an image in OpenCV Python?How to Implement FLANN Based Feature Matching in OpenCV PythonHow to Implement ORB Feature Detectors in OpenCV Python?How to implement probabilistic Hough Transform in OpenCV Python?How to join two images horizontally and vertically using OpenCV Python?How to Mask an Image in OpenCV Python?How to Match Image Shapes in OpenCV Python?How to Normalize an Image in OpenCV Python?How to Perform Adaptive Mean and Gaussian Thresholding of an Image using Python OpenCV?How to Perform Bilateral Filter Operation on an Image in OpenCV using Python?How to Perform Bitwise AND Operation on Two Images in OpenCV Python?How to Perform Bitwise OR Operation on Two Images in OpenCV PythonHow to Perform Bitwise XOR Operation on Images in OpenCV Python?How to Perform Different Simple Thresholding of an Image Using Python OpenCV?How to Perform Distance Transformation on a Given Image in OpenCV Python?How to Perform Image Rotation in OpenCV using PythonHow to Perform Image Translation Using OpenCV in Python?How to Perform Image Transpose Using OpenCV Python?How to Perform Matrix Transformation in OpenCV Python?How to perform Otsu's thresholding on an image using Python OpenCV?How to Plot Histograms of Different Colors of an Image in OpenCV Python?How to Resize an Image in OpenCV Using Python?How to Rotate an Image in OpenCV Python?How to Split an Image into Different Color Channels in OpenCV Python?Implementing k-Nearest Neighbor in OpenCV PythonImplementing Shi-Tomasi Corner Detector in OpenCV PythonOpenCV Python ŌĆō How to add borders to an image?OpenCV Python ŌĆō How to compute and plot the histogram of a region of an image?OpenCV Python ŌĆō How to Convert a Colored Image to a Binary Image?OpenCV Python – How to detect and draw keypoints in an image using SIFT?Opencv Python – How to display the coordinates of points clicked on an image?OpenCV Python ŌĆō How to draw a rectangle using Mouse Events?OpenCV Python ŌĆō How to Draw Circles Using Mouse Events?OpenCV Python ŌĆō How to draw curves using Mouse Events?OpenCV Python ŌĆō How to find and draw extreme points of an object on an image?OpenCV Python ŌĆō How to find the shortest distance between a point in the image and a contour?OpenCV Python ŌĆō How to perform bitwise NOT operation on an image?OpenCV Python ŌĆō How to Perform SQRBox Filter Operation on An ImageOpenCV Python – Implementing feature matching between two images using SIFTOpenCV Python – Matching the key points of two images using ORB and BFmatcherSmile Detection using Haar Cascade in OpenCV using Python