2017-03-05 423 views
0

如何使用小波变换融合2幅图像。有几种方法可用,如主成分分析,高通滤波,IHS等。我想知道如何使用小波变换进行融合。我知道背后的理论,并想知道如何在Python中实现它。图像融合在Python中使用小波变换

这是基于小波变换的图像融合的链接转换https://www.slideshare.net/paliwalumed/wavelet-based-image-fusion-33185100

+0

你说你知道理论,所以请加上解释国家如何在理论上进行融合,而不是那些不了解理论的人可以帮助你实施。 –

+0

@AmitayNachmani https://www.slideshare.net/paliwalumed/wavelet-based-image-fusion-33185100 – Salveru

+0

你可以请你发布两张你想要保险的图片 –

回答

2

首先,你需要下载PyWavelet https://pywavelets.readthedocs.io/en/latest/

二图片上的运行下面的代码:

import pywt 
import cv2 
import numpy as np 

# This function does the coefficient fusing according to the fusion method 
def fuseCoeff(cooef1, cooef2, method): 

    if (method == 'mean'): 
     cooef = (cooef1 + cooef2)/2 
    elif (method == 'min'): 
     cooef = np.minimum(cooef1,cooef2) 
    elif (method == 'max'): 
     cooef = np.maximum(cooef1,cooef2) 
    else: 
     cooef = [] 

    return cooef 


# Params 
FUSION_METHOD = 'mean' # Can be 'min' || 'max || anything you choose according theory 

# Read the two image 
I1 = cv2.imread('i1.bmp',0) 
I2 = cv2.imread('i2.jpg',0) 

# We need to have both images the same size 
I2 = cv2.resize(I2,I1.shape) # I do this just because i used two random images 

## Fusion algo 

# First: Do wavelet transform on each image 
wavelet = 'db1' 
cooef1 = pywt.wavedec2(I1[:,:], wavelet) 
cooef2 = pywt.wavedec2(I2[:,:], wavelet) 

# Second: for each level in both image do the fusion according to the desire option 
fusedCooef = [] 
for i in range(len(cooef1)-1): 

    # The first values in each decomposition is the apprximation values of the top level 
    if(i == 0): 

     fusedCooef.append(fuseCoeff(cooef1[0],cooef2[0],FUSION_METHOD)) 

    else: 

     # For the rest of the levels we have tupels with 3 coeeficents 
     c1 = fuseCoeff(cooef1[i][0],cooef2[i][0],FUSION_METHOD) 
     c2 = fuseCoeff(cooef1[i][1], cooef2[i][1], FUSION_METHOD) 
     c3 = fuseCoeff(cooef1[i][2], cooef2[i][2], FUSION_METHOD) 

     fusedCooef.append((c1,c2,c3)) 

# Third: After we fused the cooefficent we nned to transfor back to get the image 
fusedImage = pywt.waverec2(fusedCooef, wavelet) 

# Forth: normmalize values to be in uint8 
fusedImage = np.multiply(np.divide(fusedImage - np.min(fusedImage),(np.max(fusedImage) - np.min(fusedImage))),255) 
fusedImage = fusedImage.astype(np.uint8) 

# Fith: Show image 
cv2.imshow("win",fusedImage) 

的fusedImage是I1和I2的结果融合

+0

谢谢兄弟....你可以请分享我的任何链接的教程Pywavelets – Salveru

+0

在同一链接我张贴有一个链接到那里的教程 –