python3实现cv2+numpy裁剪不规则四边形图片
功能
从给定的图片中裁剪不规则四边形,保持图片不变形,不旋转。
效果图
依赖环境
- cv2
- numpy
- python3
核心代码
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)
测试结果
-
输入图片
-
输出图片
-
完整效果图
完整代码
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)