OpenCV图像金字塔
程序员文章站
2022-07-14 11:34:02
...
本文使用python实现。
图像金字塔
import cv2 as cv
import numpy as np
def pyramid_demo(image): # 图像金字塔
level = 3
temp = image.copy()
pyramid_images = []
for i in range(level):
dst = cv.pyrDown(temp)
'''
def pyrDown(src: Any, # 降采样原图
dst: Any = None,
dstsize: Any = None, # 见详解
borderType: Any = None) -> None
dstsize 这个参数指的是降采样之后的目标图像的大小,我们可以看出它是有默认值的,如果我们调用函数的时候不指定第三个参数,
那么这个值是按照 Size((src.cols+1)/2, (src.rows+1)/2) 计算的。
而且不管你自己如何指定这个参数,一定必须保证满足以下关系式:
|dstsize.width * 2 - src.cols| ≤ 2;
|dstsize.height * 2 - src.rows| ≤ 2;
也就是说降采样的意思其实是把图像的尺寸缩减一半,行和列同时缩减一半。所以你指定的大小,无非就是多一行少一列的区别而已。
在大多数情况下使用默认值就可了,因为这个函数不是缩减图像至任意尺寸,就只是缩减一半,所以没必要搞得那么复杂。
'''
pyramid_images.append(dst)
cv.imshow("pyramid_down_"+str(i), dst)
temp = dst.copy()
return pyramid_images
src = cv.imread("C:/Users/admin/Pictures/Saved Pictures/15.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
pyramid_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
效果
拉普拉斯金字塔
def lapalian_demo(image): # 拉普拉斯金字塔
pyramid_images = pyramid_demo(image)
level = len(pyramid_images)
for i in range(level-1, -1, -1):
if i-1 < 0:
expand = cv.pyrUp(pyramid_images[i], dstsize=image.shape[:2])
'''
def pyrUp(src: Any,
dst: Any = None,
dstsize: Any = None,
borderType: Any = None) -> None
'''
lpls1 = cv.subtract(image, expand)
'''
def subtract(src1: Any,
src2: Any,
dst: Any = None,
mask: Any = None,
dtype: Any = None) -> None
'''
cv.imshow("lapalian_demo_" + str(i), lpls1)
else:
expand = cv.pyrUp(pyramid_images[i], dstsize=pyramid_images[i-1].shape[:2])
lpls2 = cv.subtract(pyramid_images[i-1], expand)
cv.imshow("lapalian_demo_"+str(i), lpls2)
上一篇: OpenCV图像金字塔
下一篇: Opencv——图像金字塔与图像尺寸缩放