写一段Python代码,实现两张有重叠区域图像的拼接。并绘制匹配点图,单应性转换图,拼接后结果等
时间: 2024-11-04 18:11:19 浏览: 58
在Python中,我们可以使用OpenCV库来实现两张有重叠区域图像的拼接。这里是一个简单的例子,我们将使用`cv2.findHomography()`函数找到两张图像之间的单应矩阵,然后使用该矩阵进行坐标变换。
```python
import cv2
import numpy as np
# 假设我们有两个图像文件,img1.jpg和img2.jpg
img1 = cv2.imread('img1.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('img2.jpg', cv2.IMREAD_GRAYSCALE)
# 选择一个固定大小的窗口作为兴趣区域
window_size = 50
x, y = 100, 100 # 这些是你要从两张图片中选取的区域位置
roi1 = img1[y:y+window_size, x:x+window_size]
roi2 = img2[y:y+window_size, x:x+window_size]
# 找到兴趣区域内对应点的匹配
matcher = cv2.SIFT_create() # 使用SIFT特征匹配器
keypoints1, descriptors1 = matcher.detectAndCompute(roi1, None)
keypoints2, descriptors2 = matcher.detectAndCompute(roi2, None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(descriptors1, descriptors2, k=2) # 获取最相似的前两个匹配
# 筛选出可靠的匹配
good_matches = []
for m, n in matches:
if m.distance < 0.7 * n.distance: # 一般设定阈值为0.7
good_matches.append([m])
# 计算单应矩阵
if len(good_matches) > 4: # 需要有足够的匹配点
src_pts = np.float32([ keypoints1[m.queryIdx].pt for m in good_matches ]).reshape(-1, 1, 2)
dst_pts = np.float32([ keypoints2[m.trainIdx].pt for m in good_matches ]).reshape(-1, 1, 2)
H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
else:
print("Not enough good matches are found - %d/%d" % (len(good_matches), min(len(descriptors1), len(descriptors2))))
H = None
# 如果找到了有效的单应矩阵,进行图像变换并拼接
if H is not None:
height, width, channels = img2.shape
M = np.hstack((np.eye(3), np.zeros((3, 1))))
M[:2, 2] = [-x, -y]
dst = cv2.warpPerspective(img2, M @ H, (width, height))
result = cv2.addWeighted(img1, 0.5, dst, 0.5, 0)
# 绘制匹配点和单应性变换
draw_params = dict(matchColor=(0, 255, 0),
singlePointColor=None,
matchesMask=mask.ravel().tolist(),
flags=2)
img3 = cv2.drawMatchesKnn(img1, keypoints1, img2, keypoints2, good_matches, None, **draw_params)
cv2.imshow('Matches', img3)
cv2.imshow('Pasted Image', result)
cv2.waitKey(0)
```
这个代码首先计算两张图片兴趣区域内的匹配点,然后使用RANSAC算法确定最佳的单应矩阵。接着,它使用单应矩阵对第二张图片进行变换并进行拼接,最后显示匹配点图和拼接后的结果。
注意:这只是一个基础示例,实际应用中可能需要更复杂的预处理步骤,比如去除噪声、增强对比度等,以便提高匹配效果。同时,如果你没有足够的匹配点,`findHomography()`可能会返回None,表示无法准确地进行图像拼接。
阅读全文