图像倾斜矫正

该博客介绍了如何利用Python的OpenCV库对图像进行透视变换矫正,特别是针对图像倾斜和形变较大的情况。首先通过寻找图像的外接四边形并进行多边形拟合,然后确定四个顶点进行透视变换。最终通过`cv2.getPerspectiveTransform`和`cv2.warpPerspective`函数实现矫正,并展示了矫正前后的对比效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图像倾斜厉害,或者拼接后的图片形变较大就可以进行透视变换进行矫正。

矫正步骤:

1. 对形变图形寻找外接四边形,这里可以使用多边形拟合进行

2. 四边形对应透视变换后矩形的四个顶点

3. 透视变换矫正

python opencv 实现的代码如下:

import cv2
import numpy as np

imgp= "stitch_img.jpg"
img = cv2.imread(imgp)
indx=np.where((img[:,:,0]>1) | (img[:,:,1]>1) | (img[:,:,2]>1))
binary = np.zeros((img.shape[0],img.shape[1]),dtype="uint8")
binary[indx]=255
cv2.imwrite('binary.jpg', binary)
# contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE,cv2.RETR_EXTERNAL)
##寻找contours
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
areas = []
for c in range(len(contours)):
    areas.append(cv2.contourArea(contours[c]))
max_id = areas.index(max(areas))
print(max_id)
rect = cv2.minAreaRect(contours[max_id])
show = np.zeros(img.shape,dtype="uint8")

##寻找最大面积contours
cnt_len = cv2.arcLength(contours[max_id], True)
#contour进行多边形拟合
cnt = cv2.approxPolyDP(contours[max_id], 0.02*cnt_len, True)
if len(cnt) >= 4:
    print(cnt.shape)
    points = cnt[:,0,:].tolist()
    points.sort(key=lambda i:i[0])
    #寻找四边形四个顶点
    lt = points[0] if points[0][1]<points[1][1] else points[1]
    ld = points[0] if points[0][1]>points[1][1] else points[1]

    rt = points[-2] if points[-2][1]<points[-1][1] else points[-1]
    rd = points[-2] if points[-2][1]>points[-1][1] else points[-1]
    pts1 = np.float32([lt,rt,rd,ld])
    wid=max(rt[0]-lt[0], rd[0]-ld[0])
    hei=max(ld[1]-lt[1], rd[1]-rt[1])

    pts2 = np.float32([[0,0],[wid,0],[wid,hei],[0,hei]])
    print(lt, ld, rt, rd)
    cv2.drawContours(show, [cnt], -1, (255, 255, 0), 3 )
    # 透视变换
    M = cv2.getPerspectiveTransform(pts1,pts2)
    dst = cv2.warpPerspective(img, M, (wid,hei))

    cv2.imwrite('rect.jpg', dst)

矫正后结果如下所示,左边矫正前----->右边为矫正后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_21331593

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值