NumPy/OpenCV 2: how do I crop non-rectangular region? NumPy/OpenCV 2: how do I crop non-rectangular region? numpy numpy

NumPy/OpenCV 2: how do I crop non-rectangular region?


*edit - updated to work with images that have an alpha channel.

This worked for me:

  • Make a mask with all black (all masked)
  • Fill a polygon with white in the shape of your ROI
  • combine the mask and your image to get the ROI with black everywhere else

You probably just want to keep the image and mask separate for functions that accept masks. However, I believe this does what you specifically asked for:

import cv2import numpy as np# original image# -1 loads as-is so if it will be 3 or 4 channel as the originalimage = cv2.imread('image.png', -1)# mask defaulting to black for 3-channel and transparent for 4-channel# (of course replace corners with yours)mask = np.zeros(image.shape, dtype=np.uint8)roi_corners = np.array([[(10,10), (300,300), (10,300)]], dtype=np.int32)# fill the ROI so it doesn't get wiped out when the mask is appliedchannel_count = image.shape[2]  # i.e. 3 or 4 depending on your imageignore_mask_color = (255,)*channel_countcv2.fillPoly(mask, roi_corners, ignore_mask_color)# from Masterfool: use cv2.fillConvexPoly if you know it's convex# apply the maskmasked_image = cv2.bitwise_and(image, mask)# save the resultcv2.imwrite('image_masked.png', masked_image)


The following code would be helpful for cropping the images and get them in a white background.

import cv2import numpy as np# load the imageimage_path = 'input image path'image = cv2.imread(image_path)# create a mask with white pixelsmask = np.ones(image.shape, dtype=np.uint8)mask.fill(255)# points to be croppedroi_corners = np.array([[(0, 300), (1880, 300), (1880, 400), (0, 400)]], dtype=np.int32)# fill the ROI into the maskcv2.fillPoly(mask, roi_corners, 0)# The mask imagecv2.imwrite('image_masked.png', mask)# applying th mask to original imagemasked_image = cv2.bitwise_or(image, mask)# The resultant imagecv2.imwrite('new_masked_image.png', masked_image)

Input Image:input image

Mask Image:mask image

Resultant output image:enter image description here