簡介
拉普拉斯金字塔用於在多個尺度上對圖像進行分析,其應用範圍廣泛,如壓縮、紋理合成和調和化等。但其在邊緣處理方向的應用非常少,因爲拉普拉斯算子爲二階差分,其方向信息丟失,常產生雙像素,對噪聲有雙倍加強作用,因此它很少直接用於邊緣檢測。一般是將高斯濾波和拉普拉斯邊緣檢測結合在一起,即Laplacian of Gaussian (LoG)算子優化而成的. 先用高斯算子對圖像進行平滑(去掉噪聲的影響),然後採用拉普拉斯算子根據二階微分過零點來檢測圖像邊緣。局部拉普拉斯濾波器創新的使用拉普拉斯的方法來進行邊緣的檢測,並且區分出圖像中的大尺度邊緣和小尺度細節。
如圖使用二階差分時會丟失邊緣細節且對模糊噪聲非常敏感
圖像金字塔
顧名思義是對圖像最大尺度不斷進行上下采樣工業城
在進行高斯金字塔運算時,由於不斷的進行高斯濾波和下采樣,我們丟失了很多高頻信號,而拉普拉斯金字塔的目的就是保存這些高頻信號,保存這些高頻信號所採用的方式就是保存差分圖像。比如,拉普拉斯金字塔的第0層,就是原始圖像和原始圖像下采樣(Reduce)後再次上採樣(Expand)的圖像的差值。 其中GL爲第L層圖像 N爲高斯金字塔頂層層號,Rl和Cl分別爲高斯金字塔第l層的行數和列數W(m,n)是一個二維可分離的55窗口函數,表達式爲:
的高斯卷積核
由G0,G1,,,GN,就構成了一個高斯金字塔,其中G0爲高斯金字塔的底層(與原圖像相同)GN爲金字塔的頂層。由此可見高斯金字塔的當前層圖像就是對其前一層圖像首先進行高斯低通濾波,然後再進行隔行和隔列的降2採樣而生成的。前一層圖像大小依次爲當前層圖像大小的4倍。
其中Down函數爲上採樣函數 Conv爲高斯濾波
import cv2,numpy as np
import matplotlib.pyplot as plt
萊娜1=cv2.imread('lena1.jpg')
萊娜2=cv2.imread('lena2.jpg')
萊娜1=cv2.cvtColor(萊娜1,cv2.COLOR_BGR2RGB)
萊娜2=cv2.cvtColor(萊娜2,cv2.COLOR_BGR2RGB)
plt.subplot(121)
plt.imshow(萊娜1)
plt.subplot(122)
plt.imshow(萊娜2)
#插值修改大小爲2的倍數
萊娜1=cv2.resize(萊娜1,(256,256),interpolation=cv2.INTER_CUBIC)
萊娜2=cv2.resize(萊娜2,(256,256),interpolation=cv2.INTER_CUBIC)
層數=8
temp=萊娜1.copy()
for index in range(層數):
dst = cv2.pyrDown(temp)
def 創建拉普拉斯金字塔(path,level):
img=cv2.imread(path)
img=cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
img= cv2.resize(img,(512,512),interpolation=cv2.INTER_CUBIC)
temp = img.copy()#拷貝圖像
高斯金字塔 = []
高斯金字塔.append(img)
for i in range(1,level):
下采樣 = cv2.pyrDown(temp)
高斯金字塔.append(下采樣)
temp = 下采樣.copy()
拉普拉斯金字塔 = [高斯金字塔[level-1]]
for i in range(level-1,0,-1):
上採樣 = cv2.pyrUp(高斯金字塔[i])
第L層的高斯金字塔 = cv2.subtract(高斯金字塔[i-1],上採樣)
拉普拉斯金字塔.append(第L層的高斯金字塔)
print('高斯金字塔層數:',len(高斯金字塔),'拉普拉斯金字塔:',len(拉普拉斯金字塔))
return 拉普拉斯金字塔
def 拉普拉斯卷積(原圖,卷積核大小):
卷積核=np.ones([卷積核大小,卷積核大小])*1/(卷積核大小*卷積核大小)
卷積圖 = np.zeros([原圖.shape[0]-(卷積核大小-卷積核大小//2),原圖.shape[1]-(卷積核大小-卷積核大小//2)])
print(原圖.shape)
原圖行數,原圖列數=原圖.shape
for y in range(卷積核大小//2,原圖行數-(卷積核大小-卷積核大小//2)):
for x in range(卷積核大小//2,原圖列數-(卷積核大小-卷積核大小//2)):
半徑=卷積核大小//2
拉普拉斯核 = np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1]))
窗口=np.sum(原圖[x-半徑:x+半徑+1,y-半徑:y+半徑+1]*拉普拉斯核)
卷積圖[x, y] = 窗口
return 卷積圖
萊娜1灰度=cv2.cvtColor(萊娜1,cv2.COLOR_RGB2GRAY)
萊娜1卷積圖=拉普拉斯卷積(萊娜1灰度,3)
萊娜2灰度=cv2.cvtColor(萊娜2,cv2.COLOR_RGB2GRAY)
萊娜2卷積圖=拉普拉斯卷積(萊娜2灰度,3)
plt.subplot(121)
plt.imshow(萊娜1卷積圖,'gray')
plt.subplot(122)
plt.imshow(萊娜2卷積圖,'gray')
可以看到第12層的拉普拉斯卷積圖