opencv-python图像金字塔
图像金字塔是图像中多尺度表达的一种,主要用于图像特征检测,图像分割等领域,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔是同一图像不同分辨率的子图集合。
一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐渐降低,且来源于同一张原始图的图像集合。层级越高,图像越小,分辨率越低。
图像金字塔的原理:相当于图像的缩小和放大。
图像缩小:先进行高斯模糊,再降采样,需要一次次的重复,不能一次到底。
图像放大:先进行图像扩大,在进行卷积或者使用拉普拉斯金字塔。
OpenCV中有关图像金字塔的操作有pyrup()和pyrdown(),分别用于完成上采样和下采样。
1 高斯金字塔
高斯金字塔(G(i))通过高斯平滑和亚采样获得一系列下采样图像,主要的图像金字塔。
向下采样:将图像和高斯内核卷积,然后将所有偶数行和列去除,处理后的图像是原图的1/4(向下采样会丢失图像信息)。
向上采用是其相反过程:1 将图像在每个方向扩大为原来的两倍,新增的行和列用0填充;2 使用先前同样的内核(乘以4)与放大后的图像卷积,获取近似值。
import cv2 import numpy as np img = cv2.imread('./cat.jpg') print(img.shape) dst = cv2.pyrDown(img) #下采样,分辨率减小1/4 print(dst.shape) dst2 = cv2.pyrUp(dst) #上采样,会模糊一些 print(dst2.shape) cv2.imshow('img',img) cv2.imshow('dst',dst) cv2.imshow('dst2',dst2) cv2.waitKey(0) cv2.destroyAllWindows()
向下采样:
向上采样:
2 拉普拉斯金字塔
用于从金字塔低层图像重建上层未采样图像,还原图像。
L(i) = G(i) - pyrUp(pyrDown(G(i)))
拉普拉斯金字塔等于 将原图先进行高斯下采样,再进行高斯上采样,然后用原图减去采样后的图,即拉普拉斯金字塔是通过原始图像减去先缩小后放大的图像的一系列图像构成,保留的是残差。拉普拉斯金字塔图像只是图像边缘,大部分是0,用于图像压缩。
拉普拉斯金字塔流程如下:
import cv2 import numpy as np img = cv2.imread('./cat.jpg') dst_down = cv2.pyrDown(img) #高斯下采样 dst_up = cv2.pyrUp(dst_down) #高斯上采样 lap0 = img - dst_up #第0层 拉普拉斯金字塔图 dst1_down = cv2.pyrDown(dst_down) dst1_up = cv2.pyrUp(dst1_down,dstsize=(dst_down.shape[1],dst_down.shape[0])) print(dst_down.shape) print(dst1_up.shape) lap1 = dst_down - dst1_up #第1层 拉普拉斯金字塔图 new_img = dst_up + lap0 #加上0层的拉普拉斯金字塔 cv2.imshow('img',img) cv2.imshow('lap0',lap0) cv2.imshow('lap1',lap1) cv2.imshow('dst_up',dst_up) cv2.imshow('new_img',new_img) cv2.waitKey(0) cv2.destroyAllWindows()
上采样还原的时候加上拉普拉斯金字塔可以尽可能的还原图像