图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割
向下取样金字塔指高分辨率图像向低分辨率图像的转换,从第i层获得第i+1层的步骤(G[i]->G[i+1])
1.对图像G【i】进行高斯卷积,卷积核为得到一个新的高斯模糊后的图像,
2.对新图像删除所有偶数行和偶数列(像素),得到缩小为原图四分之一的新图,即G[i+1]
上述操作称为Octave。
重复下去,可以不断缩小图像(每次变为原图的四分之一),但会丢失一些图像。
向上取样金字塔指低分辨率图像向高分辨率图像的转换,从第i层获得第i+1层的步骤(G[i]->G[i+1])
1.每个方向上扩大为原来的二倍,即增加行和列,新增的行和列以0填充
2.使用与向下取样同样的卷积核的4倍对每一个像素处理,得到新图
但想上去样是一个模糊图像,不能得到新的信息。
(向上取样和向下取样不是互逆的)
向下取样:Python: cv2.pyrDown(src[, dst[, dstsize]]) → dst
向上取样:Python: cv2.pyrUp(src[, dst[, dstsize]]) → dst
一般只需要src一个参数即可
import cv2 as cv
import numpy as np
#图像金字塔
img = cv.imread("E:/pictures/lena.jpg")
down = cv.pyrDown(img) #向下取样
up = cv.pyrUp(down) #向上取样
cv.imshow("up",up)
diff = img-up
cv.imshow("diffenent",diff) #比较和原图的差异
cv.imshow("orginal",img)
cv.imshow("down",down)
cv.waitKey()
cv.destroyAllWindows()
拉普拉斯金字塔:向上取样是图像的尺度变大,向下取样是图像的尺度变大,拉普拉斯金字塔:L[i] = G[i] - pyrUp(pyrDown(src))(L[i]表示i层拉普拉斯图像,G[i]表示原图)也就是上述代码的diffent图像,是在高斯金字塔的基础上构造的金字塔,意思是拉普拉斯金字塔每一层的图像为同一层高斯金字塔的图像减去上一层的图像进行上采样并高斯模糊的结果。说的有点绕,可以看网上的这幅图进行理解
实现起来很简单:
img = cv.imread("E:/pictures/lena.jpg")
down = cv.pyrDown(img)
up = cv.pyrUp(down)
L1 = img-up #1层拉普拉斯图像
down2 = cv.pyrDown(down)
up2 = cv.pyrUp(down2)
L2 = down-up2 #2层拉普拉斯图像
#以此类推..........
cv.imshow("orginal",img)
cv.imshow("L1",L1)
cv.imshow("L2",L2)
cv.waitKey()
cv.destroyAllWindows()