问题描述
我想混合两个相似的图像(在可见光和红外光下拍摄)。图像是用不同的相机拍摄的,没有对齐。我需要先找到匹配项并扭曲它们。
我使用此代码查找匹配项。它在大多数情况下都可以正常工作,但对于某些图像,它会失败。没有找到足够的内点。
我可以做些什么来改进它?更改参数或算法?或者以某种方式预处理图像?
我认为问题在于关键点检测,在某些情况下,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 (将#修改为@)