如何解决如何使用 Harris 检测器和 RANSAC 优化两幅图像的匹配
我想混合两个相似的图像(在可见光和红外光下拍摄)。图像是用不同的相机拍摄的,没有对齐。我需要先找到匹配项并扭曲它们。
我使用此代码查找匹配项。它在大多数情况下都可以正常工作,但对于某些图像,它会失败。没有找到足够的内点。
我可以做些什么来改进它?更改参数或算法?或者以某种方式预处理图像?
我认为问题在于关键点检测,在某些情况下,Harris 角点检测器正确选择的特征并不多。有什么更好的方法吗?
我试图将这段代码放入一个循环中并使用不同的参数运行它,但它没有多大帮助。也许我运气不好,这种类型的图像很难匹配。
from imageio import imread
import matplotlib.pyplot as plt
from skimage import img_as_float
from skimage.color import rgb2gray
from skimage.transform import ProjectiveTransform
from skimage.measure import ransac
from skimage.feature import plot_matches,match_descriptors,corner_peaks,corner_harris,BRIEF
def show_matches(images,keypoints,matches):
fig,ax = plt.subplots(1,1,figsize=(7,7))
plot_matches(ax,*images,*keypoints,matches)
ax.axis('off')
plt.show()
KEYP_CFG = dict(
min_distance = 3,threshold_rel = 1e-7,)
RANS_CFG = dict(
max_trials = 800,min_samples = 10,residual_threshold = 1,)
MATCH_CFG = dict(
max_distance = 200,)
BRIEF_CFG = dict(
patch_size = 59,)
fpaths = ["a.png","b.jpg"]
images = [img_as_float(imread(fp)) for fp in fpaths]
images_gray = [rgb2gray(im) if im.ndim > 2 else im for im in images]
print("find matches...")
keypoints = []
descriptors = []
brief = BRIEF(mode="uniform",**BRIEF_CFG)
for im in images_gray:
keypoints1 = corner_peaks(corner_harris(im),**KEYP_CFG)
brief.extract(im,keypoints1)
keypoints.append(keypoints1[brief.mask])
descriptors.append(brief.descriptors)
matches = match_descriptors(*descriptors,cross_check=True,**MATCH_CFG)
show_matches(images_gray,matches)
print("calc transformation...")
src_keys = keypoints[1][matches[:,1]][:,::-1]
dst_keys = keypoints[0][matches[:,0]][:,::-1]
model_robust,inliers = ransac(
(src_keys,dst_keys),ProjectiveTransform,**RANS_CFG)
show_matches(images_gray,matches[inliers])
匹配失败的例子:
工作正常且可用于扭曲和混合图像的匹配示例:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。