图像处理26:图像金子塔

一般情况下,我们要处理是一副具有固定分辨率的图像。但是有些情况下, 我们需要同一图像的不同分辨率的子图像进行处理

比如要在一幅图像中查找某个目标,比如脸,而且不知道目标在图像中的尺寸大小。这种情况下,需要创建一组图像,这些图像是具有不同分辨率的原始图像。这组图像叫做图像金字塔(简单来说就是同一图像的不同分辨率的子图集合)。如果把最大的图像放在底部,最小的放在顶部,看起来像一座金字 塔,故而得名图像金字塔。

两类图像金字塔:高斯金字塔拉普拉斯金字塔。高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值。这样 操作一次一个 MxN 的图像就变成了一个 M/2xN/2 的图像。所以这幅图像的面积就变为原来图像面积的四分之一。这被称为an Octave(一个八度)。连续进行这样的操作就会得到一个分辨率不断下降的图像金字塔。

可以使用函数cv2.pyrDown()和cv2.pyrUp()构建图像金字塔。 函数cv2.pyrDown()从一个高分辨率大尺寸的图像向上构建一个金子塔 (尺寸变小,分辨率降低)。函cv2.pyrUp()从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)。


#coding:utf-8

import cv2
import numpy as np
from matplotlib import pyplot as plt


img = cv2.imread('F:/9.jpg')

higher_reso = cv2.pyrUp(img)#向上构建金子塔(需要循环构建)
lower_reso = cv2.pyrDown(img)#向下构建金子塔(需要循环构建)

while(1):
    cv2.imshow('Img',img)
    cv2.imshow('HigherReso',higher_reso)
    cv2.imshow('LowerReso',lower_reso)
    if  cv2.waitKey(1) & 0xFF==27:
        break


结果图:




注意:因为一旦使 用 cv2.pyrDown(),图像的分辨率就会降低,信息就会被丢失。如果 先cv2.pyrDown()产生的中间图像 使用函数 cv2.pyrUp()得到图像,与原图像相比分辨率 差了很多。修改代码:

  
  
higher_reso = cv2.pyrUp(img)#向上构建金子塔(需要循环构建)


  
  
lower_reso = cv2.pyrDown(higher_reso) #向下构建金子塔(需要循环构建)




拉普拉斯金字塔可以有高斯金字塔计算得来,公式如下:


拉普拉金字塔的图像看起来就像边界图,其中很多像素都是 0。他们经常被用在图像压缩中。添加一行代码:

img = cv2.Canny(img, 100, 200)

结果图:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值