Opencv笔记(十五)——图像金字塔

参考文献

目标

  • 学习图像金字塔
  • 学习函数cv2.pyrUp()和cv2.pyrDown()

原理

  当我们需要将图像转换到另一个尺寸的时候, 有两种可能,一种是放大图像,另一种是缩小图像。尽管在Opencv几何变换中学到了resize()函数,不过使用图像金字塔来做图像缩放也是视觉运用中广泛应用的一项技术。

  一般来说我们操作的图像是具有固定分辨率的,但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理(尤其是在我们需要提取图像特征的时候)。这个时候我们需要创建一组新的图像,这些图像是具有不同分辨率的原始图像,那么我们把这组图像讲成图像金字塔。我们把最大的图像放在底部,最小的放在底部,看起来就像金字塔。如下所示:

图像金字塔

  图像金字塔主要涉及两个函数:cv2.pyrUp()(图像尺寸变大,但分辨率不会增加),cv2.pyrDown()(图像尺寸变小,分辨率减少)

  图像金字塔有两类类型:高斯金字塔和拉普拉斯金字塔。

  高斯金字塔的顶部是通过将底部图像的连续行与列去掉得到的。每一层图像中的像素值等于下一层图像中对应位置5个像素的高斯加权平均值。这样操作一个M*N的图像就变成了(M/2)*(N/2)的图像,图像的面积就变为原来的1/4,连续进行这样的操作,就会得到一些列的金字塔的图像。如果是将图像变大,首先需要将图像在每个方向扩大为原来的两倍,新增的行和列以0填充,随后使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素” 的近似值。Opencv中可以通过函数cv2.pyrDown()和cv2.pyrUp()来构建金字塔。

函数说明

  函数cv2.pyrDown()可以将一个高分辨率图像变成低分辨率图像,其接受3个参数:

  • 要处理的图像src
  • 输出图像dst
  • 输出图像大小

默认情况下,只需要一个src参数即可,他会把图像按缩小1/4的来处理。cv2.pyrUp()函数的参数也是如此。下面是函数cv2.pyrDown()的使用。

# coding=utf-8
import cv2

img = cv2.imread("/home/wl/3.jpg", 1)
dst = cv2.pyrDown(img)

while(1):
    cv2.imshow("Result",dst)
    cv2.imwrite("/home/wl/baocun.jpg",dst)
    k = cv2.waitKey(1) & 0XFF
    if k==ord('q'):
        break;
cv2.destroyAllWindows()

原始图:

扫描二维码关注公众号,回复: 2632234 查看本文章

效果图:

  cv2.pyrUp()函数与cv2.pyrDown()函数的功能相反,把金字塔上层的图像变到下一层来,也就是图像变大,但是有一点要注意的是,虽然变大了,但是图像并不能恢复成以前的样子,也就是分辨率上不能达到以前的那种效果。

将上面代码第六行修改为:

dst = cv2.pyrUp(res)

效果图:

图像的拉普拉斯金字塔可以由图像的高斯金字塔得到,转换的公式为:

拉普拉斯金字塔的图像看起来就像是边界图,其中很多像素都是0,经常被用在图像压缩中。

# coding=utf-8
import cv2

img = cv2.imread("/home/wl/3.jpg", 0)
img1 = cv2.pyrDown(img) #高斯金字塔
temp_img1 = cv2.pyrUp(img1)
img2 = cv2.pyrDown(temp_img1)
dst = img1 - img2 #拉普拉斯金字塔
cv2.imwrite("/home/wl/baocun.jpg",dst)
while(1):
    cv2.imshow("Result1",img1)
    cv2.imshow("Result2",dst)
    cv2.imwrite("/home/wl/baocun.jpg",img1)
    cv2.imwrite("/home/wl/baocun1.jpg", dst)
    k = cv2.waitKey(1) & 0XFF
    if k==ord('q'):
        break;
cv2.destroyAllWindows()

效果图:

高斯金字塔处理结果
拉普拉斯金字塔处理结果

猜你喜欢

转载自blog.csdn.net/wzyaiwl/article/details/81287251