光学成像畸变

[复制链接]
匿名  发表于 2023-4-24 16:28:41 |阅读模式
请给出光学成像系统中常见的畸变矫正算法,介绍其原理与流程,并给出程序
回复

使用道具 举报

全部回复3 显示全部楼层
机器人Gpt 发表于 2023-4-24 16:29:41 | 显示全部楼层
常见的光学成像畸变矫正算法有以下几种:
1. 相机内参矩阵法
2. 标定板法
3. 双线性插值法
4. 反向投影法
5. 射线追踪法

这里介绍其中一种常用的方法——相机内参矩阵法:

原理:相机内参矩阵是描述相机内部光学特性的参数矩阵,包括焦距、位置、旋转角度等。通过对相机内参矩阵进行矫正,可以消除由于像素点大小和位置误差、透镜成像失真等因素引起的畸变。具体来说,相机内参矩阵法包括两个步骤:将原始图像中的像点映射至归一化平面上的坐标系,再将归一化平面上的坐标系映射至校正后的图像坐标系。

流程:
1. 计算相机内参矩阵K,包括焦距fx, fy,主点位置cx, cy等参数。
2. 对原始图像中的每个像素点(x,y)计算归一化平面上的坐标系下的坐标(X,Y),其中 X=(x-cx)/fx, Y=(y-cy)/fy。
3. 进行畸变矫正,将归一化平面上的坐标系下的坐标映射至校正后的图像坐标系。
4. 将校正后的坐标重新映射至实际图像坐标中。

代码实现:
  1. import cv2
  2. import numpy as np
  3. # 计算相机内参矩阵K
  4. def get_K():
  5.     # 假设相机焦距和主点位置已知
  6.     fx, fy = 100, 100
  7.     cx, cy = 320, 240
  8.     K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
  9.     return K
  10. # 对归一化平面上的坐标进行畸变矫正
  11. def undistort_pts(pts, K, D):
  12.     npts = pts.shape[0]
  13.     # 将像素坐标矩阵转换为归一化平面坐标矩阵
  14.     pts_norm = cv2.undistortPoints(pts, K, D)
  15.     # 将归一化平面坐标矩阵加载到图像上进行可视化比较
  16.     img_norm = np.zeros((480, 640), dtype=np.uint8)
  17.     for i in range(npts):
  18.         x_norm, y_norm = pts_norm[i][0][0], pts_norm[i][0][1]
  19.         x_img, y_img = int(x_norm*K[0, 0]+K[0, 2]), int(y_norm*K[1, 1]+K[1, 2])
  20.         img_norm[y_img, x_img] = 255
  21.     cv2.imshow('Normalized Image', img_norm)
  22.     cv2.waitKey()
  23.     return pts_norm
  24. # 对校正后的坐标重新映射至实际图像坐标中
  25. def redistort_pts(pts, K, D):
  26.     npts = pts.shape[0]
  27.     # 将归一化平面坐标矩阵转换为像素坐标矩阵
  28.     pts_img = cv2.undistortPoints(pts, K, D, P=K)
  29.     # 将像素坐标矩阵加载到图像上进行可视化比较
  30.     img_redist = np.zeros((480, 640), dtype=np.uint8)
  31.     for i in range(npts):
  32.         x_img, y_img = int(pts_img[i][0][0]), int(pts_img[i][0][1])
  33.         img_redist[y_img, x_img] = 255
  34.     cv2.imshow('Redistorted Image', img_redist)
  35.     cv2.waitKey()
  36.     return np.squeeze(pts_img)
  37. # 测试代码
  38. if __name__ == "__main__":
  39.     img = cv2.imread('distorted_image.jpg')
  40.     # 获取相机内参矩阵
  41.     K = get_K()
  42.     # 计算畸变系数D,假定已知
  43.     D = np.array([0.1, -0.2, 0, 0])
  44.     # 提取待校正的特征点
  45.     # 假定已经通过关键点检测或者其他方式得到了一个nptsx2的浮点型特征点矩阵pts
  46.     pts = np.array([[200, 200], [400, 200], [300, 300], [200, 400]])
  47.     # 进行畸变校正
  48.     pts_norm = undistort_pts(pts, K, D)
  49.     pts_redist = redistort_pts(pts_norm, K, D)
  50.     # 绘制原始图像和校正后的图像
  51.     img_vis = np.zeros((480, 640), dtype=np.uint8)
  52.     for i in range(npts):
  53.         x_img, y_img = int(pts[i][0]), int(pts[i][1])
  54.         img_vis[y_img, x_img] = 255
  55.     cv2.imshow('Original Image', img_vis)
  56.     cv2.waitKey()
  57.     for i in range(npts):
  58.         x_img, y_img = int(pts_redist[i][0]), int(pts_redist[i][1])
  59.         img_vis[y_img, x_img] = 255
  60.     cv2.imshow('Redistored Image', img_vis)
  61.     cv2.waitKey()
  62.     cv2.destroyAllWindows()
复制代码

--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2023-4-24 16:35:07
机器人Gpt 发表于 2023-4-24 16:29
常见的光学成像畸变矫正算法有以下几种:
1. 相机内参矩阵法
2. 标定板法

这是什么语言写的程序
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2023-4-24 16:35:14 | 显示全部楼层
手机用户RO40181 发表于 2023-04-24 16:35
这是什么语言写的程序

这个程序是用Python语言写的。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

快速回帖

您需要登录后才可以回帖 登录 | 立即注册 手机动态码快速登录

本版积分规则

关于楼主

匿名用户组
  • 主题

    57
  • 回答

    20
  • 积分

    59
联系客服 关注微信 访问手机版 返回顶部 返回列表