python opencv 显示图片_OpenCV-python 实现图片矫正

e50ec93462f76ff3b683d038be3ed3a4.png

先放效果图:

39cf378b6635f001a9daa3453b103d7c.png

一个歪的数独棋盘

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

13f48a073d0bd770e7ce4039d41bafea.png

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

在没有看到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

4bd715e4d19eb523a9fd353b3b6c5fad.png
原图是四个标记点

4e5a7eadc11a7374b4bb4fd8fa6c2981.png
矫正后图片的四个对应的点

附录:

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

09f0bc0d215d46597c343041821c23d6.png
显然affine transform的方法不是很好

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

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

############################# END #############################

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答您的问题。图像矫正是一种重要的图像处理技术,它可以将图像旋转、平移、缩放等操作,使其更加清晰、易于分析和处理。下面是利用 OpenCVPython 快速实现图像矫正的步骤: 1. 导入必要的库 ``` import cv2 import numpy as np ``` 2. 读取图像并转换为灰度图像 ``` img = cv2.imread('your_image_path.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ``` 3. 检测图像中的边缘 ``` edges = cv2.Canny(gray, 50, 150, apertureSize=3) ``` 4. 检测图像中的直线 ``` lines = cv2.HoughLines(edges, 1, np.pi/180, 200) ``` 5. 对检测到的直线进行排序,以便找到最长的两条直线 ``` lines = sorted(lines, key=lambda x: x[0][0], reverse=False) line1 = lines[0] line2 = lines[-1] ``` 6. 计算直线的交点,以确定旋转角度 ``` rho1, theta1 = line1[0] rho2, theta2 = line2[0] a = np.cos(theta1) b = np.sin(theta1) x0 = a * rho1 y0 = b * rho1 c = np.cos(theta2) d = np.sin(theta2) x1 = c * rho2 y1 = d * rho2 intersection = np.linalg.solve([[a, b], [c, d]], [x0, y1]) angle = np.arctan2(y1 - intersection[1], x1 - intersection[0]) angle = angle * 180 / np.pi ``` 7. 旋转图像进行矫正 ``` (h, w) = img.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) ``` 这样就可以快速实现图像矫正了。希望我的回答能够帮到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值