这里提供一种采用加权平均融合消除图像拼缝的算法,供大家使用。
如下图所示,如果两张图像直接进行拼接,就会在拼接位置处产生一条拼接缝,拼接缝的产生来源于两张图像光场有差别所导致的两者虽然是连续的结构,但是在两张图中的具体数字存在一定的差异。对于具有重叠部分的两张图像,消除这种拼缝的方法主要是基于特征点匹配所涉及;但是加权平均融合方法是最为简单有效的办法,这里将此算法的python代码给出。
第一步,计算权重,这里采用的是s型曲线所计算的权重,权重如下图所示分布
第二步是进行融合,融合结果如下所示,这里已经看不清有拼缝。
代码如下所示:
def calWeight(d,k):
'''
:param d: 融合重叠部分直径
:param k: 融合计算权重参数
:return:
'''
x = np.arange(-d/2,d/2)
y = 1/(1+np.exp(-k*x))
return y
def imgFusion(img1,img2,overlap,left_right=True):
'''
图像加权融合
:param img1:
:param img2:
:param overlap: 重合长度
:param left_right: 是否是左右融合
:return:
'''
# 这里先暂时考虑平行向融合
w = calWeight(overlap,0.05) # k=5 这里是超参
if left_right: # 左右融合
col, row = img1.shape
img_new = np.zeros((row,2*col-overlap))
img_new[:,:col] = img1
w_expand = np.tile(w,(col,1)) # 权重扩增
img_new[:,col-overlap:col] = (1-w_expand)*img1[:,col-overlap:col]+w_expand*img2[:,:overlap]
img_new[:,col:]=img2[:,overlap:]
else: # 上下融合
row,col = img1.shape
img_new = np.zeros((2*row-overlap,col))
img_new[:row,:] = img1
w = np.reshape(w,(overlap,1))
w_expand = np.tile(w,(1,col))
img_new[row-overlap:row,:] = (1-w_expand)*img1[row-overlap:row,:]+w_expand*img2[:overlap,:]
img_new[row:,:] = img2[overlap:,:]
return img_new
if __name__ =="__main__":
img1 = cv2.imread(r".\test_new1.png",cv2.IMREAD_UNCHANGED)
img2 = cv2.imread(r".\test_new2.png",cv2.IMREAD_UNCHANGED)
img1 = (img1 - img1.min())/img1.ptp()
img2 = (img2 - img2.min())/img2.ptp()
img_new = imgFusion(img1,img2,overlap=128,left_right=False)
img_new = np.uint16(img_new*65535)
cv2.imwrite(r'.\test_new3.png',img_new)
即可得上述效果