matlab畸变矫正为什么要进行归一化和反归一化处理
时间: 2024-05-05 11:14:19 浏览: 196
在进行Matlab畸变矫正时,归一化和反归一化处理是必要的步骤。这两个步骤的目的是将图像坐标转换为归一化坐标,以便更好地进行畸变矫正。
首先,进行归一化处理是为了将图像坐标转换为归一化坐标。归一化坐标是指将图像坐标映射到一个固定的范围内,通常是[-1, 1]或[0, 1]。这样做的好处是可以消除图像尺度的影响,使得不同尺寸的图像可以进行统一处理。同时,归一化坐标还可以简化计算,方便后续的畸变矫正算法。
接下来,进行反归一化处理是为了将畸变矫正后的归一化坐标转换回原始的图像坐标。这个步骤是为了保持图像的几何形状和尺寸不变,以便后续的图像处理和分析。反归一化处理可以将归一化坐标映射回原始图像的像素坐标,使得畸变矫正后的图像能够与原始图像对应。
总结来说,归一化和反归一化处理在Matlab畸变矫正中的作用是将图像坐标转换为归一化坐标,消除图像尺度的影响,并将畸变矫正后的归一化坐标转换回原始图像的像素坐标,保持图像的几何形状和尺寸不变。
相关问题
matlab 相机畸变校正
相机畸变校正是通过利用张正友教授的标定法来实现的。主要流程是通过不同角度拍摄棋盘图,得到相机的内参和畸变参数,然后利用这些参数进行矫正。在Matlab中,可以使用相应的库函数进行实验和参数获取,然后使用库函数undistortImage进行图像矫正。具体的代码可以参考以下示例:
```matlab
% 读取原图
I = imread('F:\raw\test\Calibration-ZhangZhengyou-Method-master\pic\ceshi\app\IMG_20230509_1445.jpg');
% 使用函数undistortImage去畸变
% cameraParams为相机标定实验获得的相机相关参数,保存在工作区
\[J, newOrigin\] = undistortImage(I, cameraParams);
% 分别展示畸变前和去畸变的照片
figure
subplot(1,2,1), imshow(I);
subplot(1,2,2), imshow(J);
% 保存去畸变后的照片
imwrite(J, 'F:\raw\123.jpg');
```
此外,Python也有相应的库函数可以进行相机畸变校正。具体的实现算法可以参考以下示例:
```python
def undistortImage(img, K, D):
# Corrects an image for lens distortion.
# K为内参矩阵,用来归一化坐标的,给定的
# D为径向畸变参数,给定的
height, width = img.shape
fx = K\[0, 0\]
fy = K\[1, 1\]
cx = K\[0, 2\]
cy = K\[1, 2\]
# 创建一个与原图大小相同的空白图像
undistorted_img = np.zeros((height, width), dtype=np.uint8)
# 依次找到去畸变后的图像坐标(y,x)对应的畸变坐标
for y in range(height):
for x in range(width):
# 第一步,通过内参矩阵归一化畸变图像的坐标
x1 = (x - cx) / fx
y1 = (y - cy) / fy
# 第二步,通过径向畸变模型得到归一化的畸变坐标
r2 = x1**2 + y1**2
x2 = x1 * (1 + D\[0\] * r2 + D\[1\] * r2**2)
y2 = y1 * (1 + D\[0\] * r2 + D\[1\] * r2**2)
# 第三步,坐标映射回去,去归一化,得到畸变坐标
u_distorted = fx * x2 + cx
v_distorted = fy * y2 + cy
# 通过上面的步骤,我们找到了正常图像坐标(y,x)对应的畸变图像坐标(u_distorted, v_distorted),下一步就是赋值了,这里用的是最近邻插值法
# 第四步,最近邻插值
if (u_distorted >= 0 and v_distorted >= 0 and u_distorted < width and v_distorted < height):
# 防止行列越界
undistorted_img\[y, x\] = img\[int(round(v_distorted)), int(round(u_distorted))\] # 通过round函数取最近的数字
else:
undistorted_img\[y, x\] = 0
return undistorted_img
```
以上是关于Matlab和Python中相机畸变校正的简要介绍和示例代码。希望对您有所帮助!
#### 引用[.reference_title]
- *1* *2* [利用matlab进行畸变矫正](https://blog.csdn.net/weixin_43847322/article/details/130879972)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [图像畸变矫正算法实现 matlab版](https://blog.csdn.net/jizhidexiaoming/article/details/89025810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
matlab中图像投射矫正代码
在MATLAB中,图像投影矫正通常涉及到图像几何校正,例如纠正由于镜头畸变、运动或其他因素导致的图像失真。常用的是使用相机矩阵和径向畸变模型来进行矫正。下面是一个简单的步骤概述及代码示例:
1. 导入图像并估计内参矩阵(Intrinsics Matrix):
- 对于灰度图像,使用`imread`读取图片,然后通过`cameraMatrixEstimation`估计内参矩阵。
```matlab
img = imread('image_path');
[cameraMatrix, distCoeffs] = cameraMatrixEstimation(img);
```
如果需要手动输入内参矩阵,可以直接赋值给`cameraMatrix`。
2. 估计外参矩阵(Extrinsic Matrix)(如果有场景坐标系和图像坐标系之间的旋转和平移信息):
- 使用`estimateWorldCameraPose`或`solvePnP`函数。
```matlab
objectPoints = ...; % 根据物体特征点计算的世界坐标
imagePoints = ...; % 图像上对应的像素点
extrinsicMatrix = estimateWorldCameraPose(objectPoints, imagePoints);
```
3. 应用投影变换:
- 用`projectiveTransform`或`undistortImage`进行图像矫正。
```matlab
undistortedImg = undistortImage(img, cameraMatrix, distCoeffs, extrinsicMatrix);
```
4. 可选:保存或显示校正后的图像。
```matlab
imwrite(undistortedImg, 'corrected_image_path');
imshow(undistortedImg);
```
注意,实际应用中可能需要对输入的图像和点云数据进行预处理,如归一化或去除噪声。这些步骤可能会根据实际情况有所不同。
阅读全文