欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenCV+python:图像金字塔

程序员文章站 2023-12-27 08:28:33
...

1,图像金字塔的概念
图像金字塔是一种以多分辨率来解释图像的有效但概念简单的结构。应用于图像分割,机器视觉和图像压缩。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

OpenCV+python:图像金字塔

2,图像金字塔的分类
高斯金字塔(Gussianpyramid):用来下采样,主要的图像金字塔。

拉普拉斯金字塔(Laplacianpyramid):用来从金字塔底层图像搭建上层未采样图像,上采样重建一个图像。在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。

图像金字塔中的向上和向下采样分别通过OpenCv函数pyrUp和pyrDown实现。这里的向下与向上采样,是对图像的尺寸而言的(和金字塔的方向相反),即向下就是图像尺寸缩小,向上是图像尺寸变大。

高斯金字塔(缩小图像)
为了获取层级i+1层的高斯金字塔图像,采取如下方法:
(1)对图像i进行高斯内核卷积;
(2)将所有偶数行和列去除;
得到的图像即为i+1层的图像,显而易见,结果图像只有原始图像的四分之一。通过对图像i层的不停迭代以上步骤就可以得到整个金字塔。同时可以发现,向下取样会逐渐丢失图像的信息。
OpenCV+python:图像金字塔
拉普拉斯金字塔(放大图像)
(1)将图像在每个方向扩大为原来的两倍,新增的行和列以0填充;
(2)使用先前同样的内核(乘以四)与放大后的图像卷积,获得“新增像素”的值
得到的图像即为放大后的图像,但是与原来图像相比发现会比较模糊,因为在缩放的过程中已经丢失了一些信息,这些数据形成了拉普拉斯金字塔。也就是说,拉普拉斯金字塔是通过源图像减去先缩小后放大的图像的一些图像构成的。
OpenCV+python:图像金字塔拉普拉斯金字塔(放大图像)用于重建图像,也就是预测残差(因为小图像放大,必须插入一些像素值,那这些像素值是什么才合适呢,那就得进行根据周围像素进行预测),对图像进行最大程度的还原。比如一幅小图像重建为一幅大图像。上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得看拉普拉斯金字塔了。Opencv可用:L(i)=G(i) - PyrUp(G(i+1));将降采样之后的图像再进行上采样操作,然后与之前还没降采样的原图进行做差得到残差图为还原图像做信息的准备!

再提一点,关于图像金字塔非常重要的一个应用就是实现图像分割。图像分割的话,先要建立一个图像金字塔,然后在G_i和G_i+1的像素直接依照对应的关系,建立起”父与子“关系。而快速初始分割可以先在金字塔高层的低分辨率图像上完成,然后逐层对分割加以优化

另外,如果单纯要做缩放就用resize函数,很方便而且图像不会变模糊!
源代码示例:

import cv2 as cv
import numpy as np


def pyramid_demo(image): #图像金字塔
    level = 3       #定义金字塔的层数
    temp = image.copy()
    pyramid_images = []  #金字塔图像list
    for i in range(level):
        dst = cv.pyrDown(temp)  #下采样
        pyramid_images.append(dst) #放入金字塔图像list中
        cv.imshow("pyramid_down_"+str(i), dst)
        temp = dst.copy() 
    return pyramid_images


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]) 
            lpls = cv.subtract(image, expand)
            cv.imshow("lapalian_down_" + str(i), lpls)
        else:
            expand = cv.pyrUp(pyramid_images[i], dstsize=pyramid_images[i-1].shape[:2])
            lpls = cv.subtract(pyramid_images[i-1], expand)#L(i-1)=G(i-1) - PyrUp(G(i))
            cv.imshow("lapalian_down_"+str(i), lpls)


src = cv.imread("F:/images/lena.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
pyramid_demo(src)
lapalian_demo(src)

cv.waitKey(0)

cv.destroyAllWindows()

运行结果:
OpenCV+python:图像金字塔OpenCV+python:图像金字塔
OpenCV+python:图像金字塔
OpenCV+python:图像金字塔
OpenCV+python:图像金字塔
OpenCV+python:图像金字塔

上一篇:

下一篇: