如何将PIL的QUAD四边形变换改写为等效的OpenCV-Python实现
问题原因与解决方法
存在两个核心错误导致变换结果不一致:
- 点的对应顺序不匹配
PIL的Image.QUAD参数要求传入的四边形点顺序为:输出矩形的【左上→左下→右下→右上】对应的输入图像坐标,而你编写的OpenCV代码里设置的目标点顺序为【左上→右上→右下→左下】,和PIL的对应关系完全错位,直接导致变换结果扭曲。 - 输入点顺序调整错误
你为了适配OpenCV的常规点顺序,错误修改了输入四边形点的排列,但没有同步调整目标点的对应关系,进一步放大了变换偏差。
正确的等效OpenCV代码
import cv2 import numpy as np img_cv = cv2.imread(image_file) h, w = img_cv.shape[:2] # 完全对齐PIL的QUAD点对应关系:输入图上的四个点,依次对应输出的左上、左下、右下、右上 src_quad = np.array([(100,80), (0, h//2), (w//2, h//2), (w//2, 0)], dtype=np.float32) # 输出矩形的四个角点,顺序和src_quad严格一一对应 dst_pts = np.array([[0, 0], [0, h], [w, h], [w, 0]], dtype=np.float32) # 计算透视变换矩阵 H = cv2.getPerspectiveTransform(src_quad, dst_pts) # 执行变换,使用双线性插值,和PIL的BILINEAR效果对齐 transformed_image = cv2.warpPerspective(img_cv, H, (w, h), flags=cv2.INTER_LINEAR) # 若需要和PIL输出的颜色完全对齐,需要把BGR转成RGB再保存(PIL存图用RGB通道顺序,OpenCV默认BGR) # transformed_image = cv2.cvtColor(transformed_image, cv2.COLOR_BGR2RGB) cv2.imwrite('output_cv.jpg', transformed_image)
补充说明
如果需要完全对齐PIL的输出效果,还需要注意边缘填充规则:如果变换后有超出原图的区域,PIL默认填充黑色,OpenCVwarpPerspective默认也是填充黑色,不需要额外调整;如果有特殊填充需求可以通过borderMode和borderValue参数设置。
内容的提问来源于stack exchange,提问作者Mohammed B.
相关产品推荐
相关产品推荐

