使用python实现Quickbird 影像作为参考影像, 用二次多项式实现高景影像的相对配准,使用一部分特征点参与多项式拟合,计算内符合精度,另一部分不参与拟合,计算外符合精度
时间: 2024-03-04 10:48:45 浏览: 84
好的,您的问题是如何使用Python实现Quickbird影像的相对配准,并使用一部分特征点参与多项式拟合,计算内符合精度和另一部分不参与拟合的外符合精度。下面是一些步骤:
1. 导入必要的库和数据:导入gdal库,打开Quickbird影像和待配准的高景影像(可以使用gdal.Open函数打开)。
```python
import gdal
quickbird = gdal.Open('quickbird.tif')
high_res = gdal.Open('high_res.tif')
```
2. 提取影像的地理参考信息:使用GetGeoTransform()函数获取Quickbird影像和高景影像的地理参考信息,包括像素大小、旋转角度和左上角坐标。
```python
quickbird_geo = quickbird.GetGeoTransform()
high_res_geo = high_res.GetGeoTransform()
```
3. 使用SIFT算法提取特征点:使用OpenCV库中的SIFT算法提取Quickbird影像和高景影像的特征点和对应的特征描述子。
```python
import cv2
# 读取Quickbird影像和高景影像
quickbird_img = cv2.imread('quickbird.tif', cv2.IMREAD_GRAYSCALE)
high_res_img = cv2.imread('high_res.tif', cv2.IMREAD_GRAYSCALE)
# 初始化SIFT对象
sift = cv2.xfeatures2d.SIFT_create()
# 提取Quickbird影像和高景影像的特征点和对应的特征描述子
kp1, des1 = sift.detectAndCompute(quickbird_img, None)
kp2, des2 = sift.detectAndCompute(high_res_img, None)
# 匹配特征点
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
# 选择最佳匹配的特征点
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
# 选择一部分特征点参与多项式拟合
num_points = 20
points1 = [kp1[m.queryIdx].pt for m in good_matches[:num_points]]
points2 = [kp2[m.trainIdx].pt for m in good_matches[:num_points]]
```
4. 将高景影像进行二次多项式变换:使用gdal库中的gdal.Warp()函数将高景影像进行二次多项式变换,使其与Quickbird影像对齐。在函数中指定输出路径和输出影像的投影参考信息。指定GCPs参数,即使用一部分特征点参与多项式拟合。
```python
output_path = 'output.tif'
gcps = []
for i in range(num_points):
gcps.append(gdal.GCP(points2[i][0], points2[i][1], 0, points1[i][0], points1[i][1], 0))
gdal.Warp(output_path, high_res, format='GTiff', dstSRS='EPSG:4326', \
xRes=quickbird_geo[1], yRes=quickbird_geo[5], \
polynomialOrder=2, \
outputBounds=[quickbird_geo[0], quickbird_geo[3]-high_res.RasterYSize*quickbird_geo[5], quickbird_geo[0]+high_res.RasterXSize*quickbird_geo[1], quickbird_geo[3]], \
targetAlignedPixels=True, \
GCPs=gcps)
```
5. 计算内符合精度和外符合精度:使用gdal库中的gdal.Open()函数打开配准后的高景影像,使用gdal库中的gdal.ComputeRMSE()函数计算内符合精度。使用SIFT算法提取另一部分特征点,并将其投影到配准后的高景影像上,计算外符合精度。
```python
import numpy as np
output = gdal.Open(output_path)
# 计算内符合精度
rmse = gdal.ComputeRMSE(quickbird, output)
print('内符合精度 RMSE: ', rmse)
# 计算外符合精度
points1 = np.array([kp1[m.queryIdx].pt for m in good_matches[num_points:]])
points2 = np.array([kp2[m.trainIdx].pt for m in good_matches[num_points:]])
points2_proj = gdal.ApplyGeoTransform(high_res_geo, points2)
points2_proj = np.column_stack((points2_proj[0], points2_proj[1]))
diff = points1 - points2_proj
distances = np.sqrt(np.sum(diff**2, axis=1))
accuracy_threshold = 5 # 设置一个阈值
num_correct = np.sum(distances < accuracy_threshold)
accuracy = num_correct / len(distances)
print('外符合精度: ', accuracy)
```
这样就可以完成Quickbird影像和高景影像的相对配准,并使用一部分特征点参与多项式拟合,计算内符合精度和另一部分不参与拟合的外符合精度了。
阅读全文