欢迎来到爱学习小可爱的“数字图像处理”入门编程小天地~
高斯&拉普拉斯金字塔&图像重建
编程目的
通过编写高斯金字塔函数以及拉普拉斯金字塔函数,对图像进行模糊处理以及改变分辨率大小,最终展现高斯金字塔、拉普拉斯金字塔、以及重建的图像。
ps:
没感动天,没感动地,只感动我自己,第二篇热腾腾的博客出炉啦~
编程核心代码基于算法,没有调用成品函数~ 如果感兴趣的话,就继续往下看吧~ 欢迎各位和我一起交流!如有引用,请标明来源哦!
https://blog.csdn.net/qq_43836026/article/details/105565359
编程原理
1.高斯金字塔
高斯金字塔是对一张图像重复进行高斯滤波和下采样得到的不同尺度的图像集合。最底层图像为原始图像G_[0],通过重复高斯滤波除去高频信号分量和下采样减小分辨率,可得到G_[1]…G_[n-1].G_[n]图像,随着层数的增加,图像分辨率逐渐减少,也更加模糊。该过程可以用公式(1.1)表示。
其中,G_[n+1]是高斯金字塔中第n+1层图像,G_[n] 是高斯金字塔中第n层图像,F是高斯滤波函数,S(scale1,scale2)是双线性插值函数,scale1、scale2分别是图像在高、长方向上分辨率变换的倍数,在本实验中,下采样的时候倍数都是0.5。
2.拉普拉斯金字塔
在高斯金字塔运算过程中,图像经过高斯滤波和下采样后会丢失部分高频信息,拉普拉斯金字塔则用来描述高斯金字塔每层操作后丢失的高频信息。拉普拉斯金字塔是用高斯金字塔每一层图像减去上一层图像经过上采样及滤波后的预测图像的图像集合。随着层数增加,分辨率逐渐增大。该过程可以用公式(1.2)表示。
其中L_[n]是拉普拉斯金字塔第n层图像,G_[n]、G¬_[n+1]分别是高斯金字塔第n层、n+1层图像,S(scale1,scale2)是双线性插值函数,上采样中,scale1、scale2由高斯金字塔中第n层和n+1层图像实际尺寸比得到,F是高斯滤波器。
由图1.2,我们可知,一个图像若有n层高斯金字塔,则有n-1层拉普拉斯金字塔。
3 重建高斯金字塔
由图1.2,我们可以知道高斯金字塔图像与拉普拉斯金字塔图像关系,从而根绝拉普拉斯金字塔图像和预测图像重建高斯金字塔图像,一层层递推,最终得到原始图像。
编程流程
编程代码
没心没肺必有我主函数
if __name__ =='__main__':
img = mpimg.imread(file_in)
#----高斯、拉普拉斯金字塔-----#
W = img.shape[0]
L = img.shape[1]
N = min(L,W)
n = math.log2(N)
n = int(n+1)
print(n)
Gaussian_Pyramid_Img_List,Gaussian_Lens_List = Gaussian_Pyramid(img,n)
Laplacian_Pyramid_Img_List,New_Img_List = Laplacian_Pyramid(Gaussian_Pyramid_Img_List,n,Gaussian_Lens_List)
huanyuan(Laplacian_Pyramid_Img_List,New_Img_List)
#-----保存显示图片-----------#
save(Gaussian_Pyramid_Img_List,Laplacian_Pyramid_Img_List)
高斯函数
def Gaussian_Pyramid(Img,count):
#------高斯卷积核------#
Gaussian_Kernel=np.array([[1/16,2/16, 1/16], [2/16, 4/16, 2/16], [1/16, 2/16, 1/16]])
fw, fh,= Gaussian_Kernel.shape
w = Img.shape[0]
h = Img.shape[1]
s1 = (w,h)
#----高斯图像List-----#
Gaussian_Img_List = [Img]
#----高斯图像尺寸List--#
Gaussian_Lens_List = [s1]
SCALE_w1 = SCALE_h1=0.5
print('高斯金字塔第0层', Img.shape)
for l in range (count-1):
iw = Gaussian_Img_List[l].shape[0