資源簡介
實現兩張圖像融合,共兩種方式,拉普拉斯金字塔融合,小波金字塔融合
代碼片段和文件信息
#?-*-?coding:?utf-8?-*-
“““
Created?on?Wed?Oct?31?15:56:33?2018
“““
#?-*-?coding:?utf-8?-*-
import?numpy?as?np
import?matplotlib.pyplot?as?plt
import?cv2
from?math?import?log
from?PIL?import?Image
import?datetime
import?pywt
?
#?以下強行用Python宏定義變量
halfWindowSize=9
src1_path?=?‘F:\\python\\1.jpg‘
src2_path?=?‘F:\\python\\2.jpg‘
?
‘‘‘
來自敬忠良,肖剛,李振華《圖像融合——理論與分析》P85:基于像素清晰度的融合規則
1,用Laplace金字塔或者是小波變換,將圖像分解成高頻部分和低頻部分兩個圖像矩陣
2,以某個像素點為中心開窗,該像素點的清晰度定義為窗口所有點((高頻/低頻)**2).sum()
3,目前感覺主要的問題在于低頻
4,高頻取清晰度圖像中較大的那個圖的高頻圖像像素點
5,算法優化后速度由原來的2min.44s.變成9s.305ms.
補充:書上建議開窗大小10*10,DWT取3層,Laplace金字塔取2層
‘‘‘
?
def?imgOpen(img_src1img_src2):
????apple=Image.open(img_src1).convert(‘L‘)
????orange=Image.open(img_src2).convert(‘L‘)
????appleArray=np.array(apple)
????orangeArray=np.array(orange)
????return?appleArrayorangeArray
?
#?嚴格的變換尺寸
def?_sameSize(img_stdimg_cvt):
????xy=img_std.shape
????pic_cvt=Image.fromarray(img_cvt)
????pic_cvt.resize((xy))
????return?np.array(pic_cvt)
?
#?小波變換的層數不能太高,Image模塊的resize不能變換太小的矩陣,不相同大小的矩陣在計算對比度時會數組越界
def?getWaveImg(appleorange):
????appleWave=pywt.wavedec2(apple‘haar‘level=2)
????orangeWave=pywt.wavedec2(orange‘haar‘level=2)
????lowApple=appleWave[0];lowOrange=orangeWave[0]
????lowAppleWidthlowAppleHeight=lowApple.shape
????lowOrangeWidthlowOrangeWidth=lowOrange.shape
????
????#?以下處理低頻
????lowAppleWeightlowOrangeWeight?=?getVarianceWeight(lowApplelowOrange)
????lowFusion?=?lowAppleWeight*lowApple?+?lowOrangeWeight*lowOrange
????#?以下處理高頻
????for?hi?in?range(13):
????????waveRec=[]
????????for?highApplehighOrange?in?zip(appleWave[hi]orangeWave[hi]):
????????????highAppWidthhighAppHeight=highApple.shape
????????????highOrangeWidthhighOrangeHeight=highOrange.shape
????????????highFusion?=?np.zeros(highApple.shape)
????????????contrastApple?=?getContrastImg(lowApplehighApple)
????????????contrastOrange?=?getContrastImg(lowOrangehighOrange)
????????????rowcol?=?highApple.shape
????????????for?i?in?xrange(row):
????????????????for?j?in?xrange(col):
????????????????????if?contrastApple[ij]?>?contrastOrange[ij]:
????????????????????????highFusion[ij]?=?highApple[ij]
????????????????????else:
????????????????????????highFusion[ij]?=?highOrange[ij]
????????????waveRec.append(highFusion)
????????recwave=(lowFusiontuple(waveRec))
????????lowFusion=pywt.idwt2(recwave‘haar‘)
????????lowApple=lowFusion;lowOrange=lowFusion
????return?lowFusion
#?求Laplace金字塔
def?getLaplacePyr(img):
????firstLevel=img.copy()
????secondLevel=cv2.pyrDown(firstLevel)
????lowFreq=cv2.pyrUp(secondLevel)
????highFreq=cv2.subtract(firstLevel_sameSize(firstLevellowFreq))
????return?lowFreqhighFreq
?
#?計算對比度,優化后不需要這個函數了,扔在這里看看公式就行
def?_getContrastValue(highWinlowWin):
????rowcol?=?highWin.shape
????contrastValue?=?0.00
????for?i?in?xrange(row):
????????for?j?in?xrange(col):
????????????contrastValue?+=?(float(highWin[ij])/lowWin[ij])**2
????return?contrastVal
評論
共有 條評論