博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV+python:图像金字塔
阅读量:3947 次
发布时间:2019-05-24

本文共 2349 字,大约阅读时间需要 7 分钟。

1,图像金字塔的概念

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

在这里插入图片描述

2,图像金字塔的分类

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

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

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

高斯金字塔(缩小图像)

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

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

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

源代码示例:

import cv2 as cvimport numpy as npdef 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_imagesdef 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()

运行结果:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

转载地址:http://gxhwi.baihongyu.com/

你可能感兴趣的文章
Android电源管理相关应用技巧分享
查看>>
Android录音失真具体解决方案
查看>>
Android根文件系统相关应用介绍
查看>>
Android文件系统深入剖析
查看>>
Android判断网络状态方法详解
查看>>
在Android上实现Junit单元测试的四部曲
查看>>
有效控制Android应用程序的耗电量
查看>>
Android术语列表概览
查看>>
全方位解读Android多媒体框架源码
查看>>
Android音乐编程的管理音频硬件
查看>>
Android UI控件组合应用之一:建立数据模型
查看>>
避免Andriod平台图片失真的图片形式
查看>>
Android之Gridview图片列表
查看>>
objdump的使用方法
查看>>
编译错误处理noproguard.classes-with-local.dex已杀死
查看>>
LTE - CSFB技术
查看>>
GSM链路层信令协议
查看>>
技术道德
查看>>
“需求为王”才是根本
查看>>
高效率的危害
查看>>