加權平均融合消除圖像拼接的拼縫(Python 代碼)

這裏提供一種採用加權平均融合消除圖像拼縫的算法,供大家使用。

如下圖所示,如果兩張圖像直接進行拼接,就會在拼接位置處產生一條拼接縫,拼接縫的產生來源於兩張圖像光場有差別所導致的兩者雖然是連續的結構,但是在兩張圖中的具體數字存在一定的差異。對於具有重疊部分的兩張圖像,消除這種拼縫的方法主要是基於特徵點匹配所涉及;但是加權平均融合方法是最爲簡單有效的辦法,這裏將此算法的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)

即可得上述效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章