[python][转载]OpenCV-python 实现图片矫正

 

先放效果图:

一个歪的数独棋盘

接下来,就是见证奇迹的时刻:

矫正之后的棋盘(只保留棋盘部分)

 

在没有看到opencv里面的几何变换之前,我一直都疑惑着说一些软件上面的自动矫正是什么原理,现在opencv里面的cv2.getPerspectiveTransform() 和cv2.warpPerspective()解决了我都疑惑。

在opencv中图像的几何变换主要缩放(scaling)、 旋转(rotation)(带缩放功能)、映射变换(affine/perspective transform)等。这里主要讲映射变换【affine/perspective transform】

affine transform 和 perspective transform的共同点都是通过输入点和输出点来计算映射矩阵。不同的是,affine transform需要的是输入个点坐标,以及这个点对应的输出坐标。perspective tranform需要的是输入个点坐标,以及这个点对应的输出坐标。这是他们的最大最大的不同。上面的图片矫正使用的是perspective tranform方法。

所以要得到将一个图片矫正,只需直到原图像上面的四个点和目标图像上与原图像对应的四个点即可(NOTE:任意三点不能共线),下面是直接的代码,很简短。cv大法好!!!

# load a image
img = cv2.imread('shudu.jpg')
rows, cols = img.shape[:2]

# original pts
pts_o = np.float32([[91, 271], [677, 192], [211, 760], [899, 628]]) # 这四个点为原始图片上数独的位置
pts_d = np.float32([[0, 0], [600, 0], [0, 600], [600, 600]]) # 这是变换之后的图上四个点的位置

# get transform matrix
M = cv2.getPerspectiveTransform(pts_o, pts_d)
# apply transformation
dst = cv2.warpPerspective(img, M, (600, 600)) # 最后一参数是输出dst的尺寸。可以和原来图片尺寸不一致。按需求来确定

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

原图是四个标记点

矫正后图片的四个对应的点

附录:

我还试了一下用affine的方法。

显然affine transform的方法不是很好

从图中可以看到,affine transform的效果没有perspective的方法好。原因是affine只使用了三个点,显然三个点并不能唯一确定一个矩形,所以总会有一个角落的部分是未矫正的。而perspective transform是四个点,则可以确定一个唯一的矩形了。

 

欢迎大家批评指正,共同进步^_^

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值