拉普拉斯金字塔与高斯金字塔

原创
2020/09/15 22:49
阅读数 2.1K

简介

拉普拉斯金字塔用于在多个尺度上对图像进行分析,其应用范围广泛,如压缩、纹理合成和调和化等。但其在边缘处理方向的应用非常少,因为拉普拉斯算子为二阶差分,其方向信息丢失,常产生双像素,对噪声有双倍加强作用,因此它很少直接用于边缘检测。一般是将高斯滤波和拉普拉斯边缘检测结合在一起,即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层的拉普拉斯卷积图

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部