目录
- 图像金字塔介绍
- 图像金字塔的分类
(1)高斯金字塔
(2)拉普拉斯金字塔 - OpenCV方法介绍及代码实现
(1)pyrDown 下采样
(2)pyrUp 下采样
图像金字塔介绍
图像金字塔是图像中多尺度表达的一种,最主要用于图像分割,也就是用来图像缩放的。
进行图像缩放可以用图像金字塔,也可以用cv.resize函数进行缩放,后果效果更好,且更加灵活
图像金字塔分类
-
高斯金字塔(Gaussianpyramid):用来下采样,最基本的金字塔
上图,将leve0为原图G0,按照level等级依次为G1,G2,G3,G4
图像下采样
为了获取层级为 G1 的金字塔图像,我们采用如下方法:
<1> 对原图像进行高斯内核卷积
<2> 将所有偶数行和列去除
得到上一层图像G1,结果图像只有原图的四分之一。通过对输入图像不停迭代以上步骤就会得到整个金字塔。同时我们也可以看到,向下取样会逐渐丢失图像的信息。
以上就是对图像的向下取样操作,即缩小图像。。图像上采样
-
拉普拉斯金字塔(Laplacianpyramid):用于重建图像,配合高斯金字塔一起使用,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图
如果想放大图像,具体做法如下:
<1>将图像G4在每个方向扩大为原来的两倍,新增的行和列以0填充
<2>使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素”的近似值
<3>再用G3减去第二步得到的图像pyrUP(G4)即的到放大的图像
得到的图像即为放大后的图像,但是与原来的图像相比会发觉比较模糊,因为在缩放的过程中已经丢失了一些信息,如果想在缩小和放大整个过程中减少信息的丢失,这些数据形成了拉普拉斯金字塔。
OpenCV方法介绍及代码实现
OpenCV方法介绍及代码实现
高斯金字塔实现下采样pyrDown
import cv2 as cv
import numpy as np
def pyramid_demo(image):
level = 3
temp = image.copy()
for i in range(level):
pyrdowm_imgs = []
dst = cv.pyrDown(temp) #对图像进行下采样,图像变成原来的四分之一
pyrdowm_imgs.append(dst) # 将每次缩小的图片储存到列表内
temp = dst.copy()
cv.imshow("level"+str(i+1), dst) #展示图片
return pyrdowm_imgs
print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/girl.jpg") #读取原图片
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
pyramid_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
使用拉普拉斯金字塔实现上采样 pyrUp
import cv2 as cv
import numpy as np
def pyramid_demo(image):
level = 3
temp = image.copy()
pyrdowm_imgs = []
for i in range(level):
dst = cv.pyrDown(temp) #对图像进行下采样,图像变成原来的四分之一
pyrdowm_imgs.append(dst) # 将每次缩小的图片储存到列表内
temp = dst.copy()
cv.imshow("level"+str(i+1), dst) #展示图片
return pyrdowm_imgs
def lapalian_demo(image):
pyrdown_imgs = pyramid_demo(image) #拉普拉斯需要使用高斯金字塔的结果
levels = len(pyrdown_imgs)
for i in range(levels-1, -1, -1):
if i == 0:
expand = cv.pyrUp(pyrdown_imgs[i], dstsize=image.shape[:2]) #这里的size必须和下一步相减的尺寸相同
lpls = cv.subtract(image, expand)
cv.imshow("lpls"+str(i), lpls)
else:
expand = cv.pyrUp(pyrdown_imgs[i], dstsize=pyrdown_imgs[i-1].shape[:2])
lpls = cv.subtract(pyrdown_imgs[i-1], expand)
cv.imshow("lpls" + str(i), lpls)
print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/girl.jpg") #读取原图片
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
lapalian_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()