图像畸变矫正python代码亚像素角点检测
时间: 2025-02-19 14:22:04 浏览: 48
### Python 实现图像畸变矫正与亚像素角点检测
对于图像处理中的畸变矫正常见于相机校准过程中,通过获取一系列棋盘格图案的图像来计算相机内部参数和畸变系数。一旦获得了这些参数,则可应用于任何由该相机拍摄得到的图片上以去除其存在的径向或切向失真效果[^2]。
#### 图像畸变矫正
下面展示一段用于执行图像畸变矫正操作的具体Python代码:
```python
import numpy as np
import cv2
import glob
# 加载已经保存好的对象点和图像点数据
objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面内的二维点
# 准备对象点,例如 (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0).
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
images = glob.glob('calibration_images/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 查找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, (7,6),None)
# 如果找到足够的点则继续
if ret == True:
objpoints.append(objp)
# 对角点进行细化定位到亚像素级别
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
imgpoints.append(corners)
# 绘制并显示角点
cv2.drawChessboardCorners(img, (7,6), corners,ret)
cv2.imshow('Image',img)
cv2.waitKey(500)
cv2.destroyAllWindows()
# 执行相机校准获得内参矩阵mtx、畸变系数dist等信息
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# 使用上述参数对一张新读入的照片做去畸变处理
img = cv2.imread('test_image.jpg')
h,w = img.shape[:2]
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
# 方法一:直接应用变换
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
# 方法二:利用重映射的方式
mapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5)
dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
# 裁剪掉黑色边界区域
x,y,w,h = roi
dst = dst[y:y+h,x:x+w]
cv2.imwrite('corrected_test_image.png',dst)
```
此段程序首先遍历指定文件夹下的所有JPEG格式照片,并尝试从中提取出预定义大小(此处假设为\(7\times6\))的标准棋盘格模式;接着调用`cornerSubPix()`函数进一步精确定位所发现的每一个角落位置至亚像素精度;最后运用`calibrateCamera()`完成整个系统的标定过程,从而取得必要的转换关系以便后续能够有效地纠正其他同类设备所产生的相似类型的几何形变现象。
#### 亚像素级角点检测
为了提高特征匹配准确性,在初步识别到粗略的位置之后通常还需要借助迭代优化算法如Lucas-Kanade光流法来进行更精细地调整直至满足给定阈值条件为止。这里采用的是OpenCV库内置的功能——`cornerSubPix()`,它接受灰度化的输入影像以及初始估计坐标的列表作为参数,经过多次循环逼近最终输出更加精确的结果集[^3]。
阅读全文
相关推荐


















