Python3 implements cv2+numpy cropping irregular quadrilateral pictures

Function

Crop a trapezoid from the given image, keeping the image undistorted and not rotated.

renderingsinsert image description here

depends on the environment

  • cv2
  • numpy
  • python3

core code

    mask = np.zeros(img.shape, dtype=np.uint8)
    roi_corners = np.array([quad], dtype=np.int32)
    
    ignore_mask_color = (255,) * img.shape[2]
    cv2.fillPoly(mask, roi_corners, ignore_mask_color)
    
    masked_img = cv2.bitwise_and(img, mask)

szZack's Blog

Test Results

  • input image
    insert image description here

  • output image
    insert image description here

  • Complete renderings
    insert image description here

full code

szZack's Blog

import cv2
import numpy as np
import argparse

# 从图片中截取不规则四边形图片
def crop_quadrilateral(img, quad):
    # img: cv2彩色图片
    # quad: [(1,1), (3,3), (2,6), (5,8)]
    
    mask = np.zeros(img.shape, dtype=np.uint8)
    roi_corners = np.array([quad], dtype=np.int32)
    
    ignore_mask_color = (255,) * img.shape[2]
    cv2.fillPoly(mask, roi_corners, ignore_mask_color)
    
    masked_img = cv2.bitwise_and(img, mask)
    masked_img[np.where(masked_img==0)] = 255
    
    return masked_img
    
    
if __name__ == '__main__':
    # python crop_quadrilateral.py --image_path=123.jpg --left_up_x=111 --left_up_y=15 --right_up_x=532 --right_up_y=62 --right_down_x=529 --right_down_y=93  --left_down_x=108 --left_down_y=46
    parser = argparse.ArgumentParser(description="crop_quadrilateral")
    
    parser.add_argument('--image_path', help='image path', type=str)
    parser.add_argument('--left_up_x', help='left_up_point', type=int)
    parser.add_argument('--left_up_y', help='left_up_point', type=int)
    parser.add_argument('--left_down_x', help='left_down_point', type=int)
    parser.add_argument('--left_down_y', help='left_down_point', type=int)
    parser.add_argument('--right_up_x', help='right_up_point', type=int)
    parser.add_argument('--right_up_y', help='right_up_point', type=int)
    parser.add_argument('--right_down_x', help='right_down_point', type=int)
    parser.add_argument('--right_down_y', help='right_down_point', type=int)
    
    args = parser.parse_args()
    
    img = cv2.imread(args.image_path)
    quad = [(args.left_up_x, args.left_up_y), (args.right_up_x, args.right_up_y), \
            (args.right_down_x, args.right_down_y), (args.left_down_x, args.left_down_y)]
    crop_img = crop_quadrilateral(img, quad)
    cv2.imwrite('./crop_img.jpg', crop_img)

Guess you like

Origin blog.csdn.net/zengNLP/article/details/128558941