遥感影像预处理

首先需要明确一下需求,根据已提供的知识和任务,我们需要实现以下三种功能:

影像拼接;
几何校正;
大气校正。
接下来,我们将分别对这三个功能进行实现,并使用 Python 语言进行编写。
图像拼接是将多张图片拼接成一个大的组合,形成一个更大的图像,以便于查看整个场景。在 Python 中,我们可以使用 OpenCV 库来实现。具体步骤如下:
1、读取多个要拼接的图像,并使用 cv2.imread() 函数加载图像。

import cv2

image_1 = cv2.imread('image_1.jpg')
image_2 = cv2.imread('image_2.jpg')
image_3 = cv2.imread('image_3.jpg')

2、将读取的图像转换为灰度图,以便于找到它们的特征点。

 

gray_1 = cv2.cvtColor(image_1, cv2.COLOR_BGR2GRAY)
gray_2 = cv2.cvtColor(image_2, cv2.COLOR_BGR2GRAY)
gray_3 = cv2.cvtColor(image_3, cv2.COLOR_BGR2GRAY)

3、使用 SIFT 算法检测每个图像的关键点和描述符。sift = cv2.xfeatures2d.SIFT_create()

kp1, des1 = sift.detectAndCompute(gray_1, None)
kp2, des2 = sift.detectAndCompute(gray_2, None)
kp3, des3 = sift.detectAndCompute(gray_3, None)

4、使用 FLANN 匹配器将多个图像的相应特征点匹配在一起。

FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)

flann = cv2.FlannBasedMatcher(index_params,search_params)

matches1 = flann.knnMatch(des1, des2, k=2)
matches2 = flann.knnMatch(des2, des3, k=2)

good_matches1 = []
for m,n in matches1:
    if m.distance < 0.7*n.distance:
        good_matches1.append(m)

good_matches2 = []
for m,n in matches2:
    if m.distance < 0.7*n.distance:
        good_matches2.append(m)

5、使用 RANSAC 算法计算每个图像之间的变换矩阵,以便于拼接它们。

MIN_MATCH_COUNT = 10

if len(good_matches1) >= MIN_MATCH_COUNT:
    src_pts = np.float32([ kp1[m.queryIdx].pt for m in good_matches1 ]).reshape(-1,1,2)
    dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good_matches1 ]).reshape(-1,1,2)
    
    M1, mask1 = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
else:
    print("Not enough matches are found - {}/{}".format(len(good_matches1), MIN_MATCH_COUNT))
    matchesMask1 = None

if len(good_matches2) >= MIN_MATCH_COUNT:
    src_pts = np.float32([ kp2[m.queryIdx].pt for m in good_matches2 ]).reshape(-1,1,2)
    dst_pts = np.float32([ kp3[m.trainIdx].pt for m in good_matches2 ]).reshape(-1,1,2)
    
    M2, mask2 = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
else:
    print("Not enough matches are found - {}/{}".format(len(good_matches2), MIN_MATCH_COUNT))
    matchesMask2 = None

6、最后,将多个图像拼接在一起,并保存为一个新的图像。

result1 = cv2.warpPerspective(image_1, M1, (image_1.shape[1] + image_2.shape[1], image_2.shape[0]))
result1[0:image_2.shape[0], 0:image_2.shape[1]] = image_2
    
result2 = cv2.warpPerspective(image_2, M2, (result1.shape[1] + image_3.shape[1], image_3.shape[0]))
result2[0:image_3.shape[0], result1.shape[1]:] = image_3

cv2.imwrite("result.jpg", result2)

几何校正是遥感图像处理中必不可少的一步,在 Python 中也有很多库可以实现该功能,如 GDAL 库、OpenCV 库等。这里我们以 OpenCV 库为例进行讲解。具体步骤如下:

1、读取遥感图像,并使用 cv2.cvtColor() 函数将其转换为灰度图。

import cv2

image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

2、使用 cv2.findChessboardCorners() 函数查找棋盘格的角点。

CHECKERBOARD = (6,9)
ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)

3、使用 cv2.drawChessboardCorners() 函数将角点绘制在图像上。

cv2.drawChessboardCorners(image, CHECKERBOARD, corners, ret)

4、使用 cv2.calibrateCamera() 函数计算相机的内参矩阵和畸变系数。

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objpoints = []
imgpoints = []

objp = np.zeros((CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[:,:2] = np.mgrid[0:CHECKERBOARD[0],0:CHECKERBOARD[1]].T.reshape(-1,2)

if ret == True:
    objpoints.append(objp)
    imgpoints.append(corners)

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

5、使用 cv2.undistort() 函数进行矫正

dst = cv2.undistort(image, mtx, dist, None, newcameramtx)

大气校正是遥感图像处理中的另一项重要工作,也可以使用 OpenCV 库实现。具体步骤如下:

1、读取待校正的遥感图像,并提取其 R、G、B 三个通道。

import cv2

image = cv2.imread('image.jpg')
b, g, r = cv2.split(image)

2、使用 cv2.min() 函数求出三个通道中的最小值。

min_channel = cv2.min(cv2.min(r, g), b)

3、对每一个通道进行大气校正。

r_corr = cv2.divide(cv2.subtract(r, k * min_channel), cv2.subtract(255, k * min_channel))
g_corr = cv2.divide(cv2.subtract(g, k * min_channel), cv2.subtract(255, k * min_channel))
b_corr = cv2.divide(cv2.subtract(b, k * min_channel), cv2.subtract(255, k * min_channel))

4、使用 cv2.merge() 函数将纠正后的三个通道合成为一幅图像

image_corr = cv2.merge((b_corr, g_corr, r_corr))

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值