项目
-
思路:
- 得到两张图片的点匹配关系
- 通过 RANSAC算法计算透视变换矩阵:直接调用函数
findHomography - 对目标图片进行透视变换,然后与另外一张图片合并
img1 = cv2.imread('./asset/part1.jpg')
img2 = cv2.imread('./asset/part2.jpg')
# 计算特征
kps1,des1 = siftDetectAndCompute(img1)
kps2,des2 = siftDetectAndCompute(img2)
# 匹配
matchs = knnMatch(des1,des2)
# 至少 4 对才能计算出透视变换矩阵;RANSAC算法采样还要多要一点
if (len(matchs) > 4):
srcPoints = []
dstPoints = []
# 配对点的位置
for match in matchs:
srcPoints.append(kps1[match.queryIdx].pt)
dstPoints.append(kps2[match.trainIdx].pt)
# 类型转换
srcPoints = np.float32(srcPoints)
dstPoints = np.float32(dstPoints)
# ransacReprojThreshold:
# findHomography(srcPoints, dstPoints[, method[, ransacReprojThreshold[,
# mask[, maxIters[, confidence]]]]]) -> retval, mask
h,mask = cv2.findHomography(srcPoints, dstPoints,cv2.RANSAC,4)
# 合并图片
imgres = cv2.warpPerspective(img1,h,(img1.shape[1] + img2.shape[1],max(img1.shape[0],img2.shape[0])))
imgres[0:img2.shape[0],0:img2.shape[1]] = img2

-
ransacReprojThreshold:当进行转换矩阵计算时,RANSAR 算法区分内点与外点的阈值。 $$ |X_{dst} - HX_{src}| > threshold $$$X_{dst}$ 与 $X_{src}$ 是一对匹配点;$H$ 为RANSAC算法得到的转换矩阵。当满足上述关系时,就认为 $X_{dst}$ 与 $X_{src}$ 是异常匹配关系(外点)。
附录:RANSAC算法
介绍
-
解决问题: 当利用 最小二乘法 处理多样本拟合问题时,最小二乘会受到噪点的干扰。

-
RANSAC算法: RANSAC通过反复选择数据中的一组随机子集来进行目的计算,例如最小二乘运算(RANSAC算法只利用了部分样本,而最小二乘是直接用全部样本)。重复多次后,选择结果最好的模型。
-
RANSAC作用: 主要解决样本中的外点问题。
- 外点:一般为数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。
算法流程

-
使用这个数据集来计算出数据模型:通过两点计算直线方程

-
将所有数据带入这个模型,计算出「内点」的数目:上述模型能够正确描述的点(绿色的)

-
重复上述步骤m次,然后从中选择出「内点」数组最多的模型

参数确定
内点占据样本比列
每次选择 k 个样本,选中一个外点的概率
M 次重复样本都包含外点的概率,即模型计算错误的概率
样本都是内点的概率,即模型计算正确的概率
重复次数就为