圖像金字塔是一系列來源于同一張原始圖像、以金字塔形狀排列的分辨率逐步降低的圖像集合,。從底層圖像可以看清更多細節(jié),,從頂層圖像可以看到更多的輪廓特征。通常,,上層圖像的寬度和高度是相鄰的下層圖像的 1/2。 在計算高斯金字塔時,不斷進行高斯濾波和下采樣,,丟失了高頻信息。為了描述這些高頻信息,,將通過原圖像減去先縮小后放大的圖像的一系列差分圖像,,定義為拉普拉斯金字塔(Laplacian Pyramid)。 6.3 基于拉普拉斯金字塔的圖像融合由于圖像噪聲,、光照,、曝光度、模型匹配誤差等因素,,圖像直接拼接合成會在圖像重疊區(qū)域的拼接處出現(xiàn)明顯的痕跡 ,。圖像融合的目的就是使兩幅圖像的重疊區(qū)域過渡自然且平滑,。 拉普拉斯金字塔將源圖像分解到不同的頻帶,越高頻的圖像信息越到上層,。在相同顯示尺寸下比較不同分辨率的拉普拉斯圖像,,可以發(fā)現(xiàn)不同尺度下關注的細節(jié)是不同的,低分辨率下關注的是較大尺度的基本紋理,,而高分辨率下關注的是更精細的紋理,。 因此,可以針對不同分解層的頻帶特征與細節(jié),,采用不同的融合算子以突出特定頻帶上特征與細節(jié),,也就可以將不同圖像的特征與細節(jié)融合在一起。 金字塔圖像融合過程,,是在不同尺度,、不同空間分辨率和不同分解層上分別進行的,也稱為多波段融合(Multi-band Blending),。多波段融合的思想,,是先對多幅圖像分別構建拉普拉斯金字塔,然后對同一層圖像(相同頻段)按一定規(guī)則融合,,對融合后的圖像金字塔重建得到融合圖像,。 基于拉普拉斯金字塔的圖像融合的基本步驟為: 例程:1.88 拉普拉斯金字塔圖像融合# 1.88:拉普拉斯金字塔圖像融合 img1 = cv2.imread("../images/buddha01.png") img2 = cv2.imread("../images/buddha03.png") img1 = cv2.resize(img1, (512, 512), interpolation=cv2.INTER_CUBIC) # 將圖片大小調(diào)整到 2**levels 的整數(shù)倍 img2 = cv2.resize(img2, (512, 512), interpolation=cv2.INTER_CUBIC) # 直接左右拼接圖像 (用于對比) rows, cols, channel = img1.shape stack = np.hstack((img1[:,:int(cols/2)], img2[:,int(cols/2):])) # 圖像向下取樣, 構造高斯金字塔: [原圖,,下取樣1次,,下取樣2次,下取樣3次,,下取樣4次] levels = 5 # 高斯金字塔層數(shù) gaussPyr1, gaussPyr2 = [img1], [img2] # 原始圖像為高斯金字塔第 0 層, (512, 512) for i in range(1, levels): # 高斯金字塔共 5 層: 0,1,2,3,4 gaussPyr1.append(cv2.pyrDown(gaussPyr1[i-1])) # 計算第 i 層高斯金字塔 gaussPyr2.append(cv2.pyrDown(gaussPyr2[i-1])) # 圖像向上取樣, 構造拉普拉斯金字塔 [第1層殘差,,第2層殘差,,第3層殘差,第4層殘差] lapPyr1, lapPyr2 = [], [] # 從最頂層開始恢復 for i in range(levels-1): # 拉普拉斯金字塔有 4 層: 0,1,2,3 lapPyr1.append(gaussPyr1[i] - cv2.pyrUp(gaussPyr1[i+1])) lapPyr2.append(gaussPyr2[i] - cv2.pyrUp(gaussPyr2[i+1])) # 拉普拉斯金字塔左右拼接 lapStack = [] for i in range(levels-1): # 拉普拉斯金字塔共 4 層: 0,1,2,3 rows, cols, channel = lapPyr1[i].shape splicing = np.hstack((lapPyr1[i][:, 0:int(cols/2)], lapPyr2[i][:, int(cols/2):])) lapStack.append(splicing) print("lapStack", i, lapStack[i].shape) # 由拼接后的Laplace金字塔恢復原圖像 rows, cols, channel = gaussPyr1[-1].shape # 高斯金字塔頂層 G4:(32,32) stackG4 = np.hstack((gaussPyr1[-1][:,:int(cols/2)], gaussPyr2[-1][:,int(cols/2):])) # 拼接高斯金字塔頂層 stackG3 = lapStack[3] + cv2.pyrUp(stackG4) # stackG3:(64,64) stackG2 = lapStack[2] + cv2.pyrUp(stackG3) # stackG2:(128,128) stackG1 = lapStack[1] + cv2.pyrUp(stackG2) # stackG1:(256,256) stackG0 = lapStack[0] + cv2.pyrUp(stackG1) # stackG0:(512,512) plt.figure(figsize=(9, 7)) plt.subplot(221), plt.axis('off'), plt.title("BuddhaFace A") plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)) plt.subplot(222), plt.axis('off'), plt.title("BuddhaFace B") plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)) plt.subplot(223), plt.axis('off'), plt.title("BuddhaFace stacked") plt.imshow(cv2.cvtColor(stack, cv2.COLOR_BGR2RGB)) plt.subplot(224), plt.axis('off'), plt.title("Laplacian blended") plt.imshow(cv2.cvtColor(stackG0, cv2.COLOR_BGR2RGB)) plt.tight_layout() plt.show() 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 程序說明: 左下圖是基于拉普拉斯金字塔的圖像融合,,右下圖是圖像直接進行拼接的結果,。直接拼接時,在左右拼接處可以看到非常明顯,、銳利的拼接縫,,稱為截斷現(xiàn)象(Seams)?;诶绽菇鹱炙膱D像拼接,,通過多頻帶融合,使兩幅圖像的重疊區(qū)域過渡自然且平滑,。 (本節(jié)完) |
|