OpenCV+python:图像金字塔
1,圖像金字塔的概念
圖像金字塔是一種以多分辨率來解釋圖像的有效但概念簡單的結(jié)構(gòu)。應用于圖像分割,機器視覺和圖像壓縮。一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐步降低,且來源于同一張原始圖的圖像集合。其通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣。金字塔的底部是待處理圖像的高分辨率表示,而頂部是低分辨率的近似。我們將一層一層的圖像比喻成金字塔,層級越高,則圖像越小,分辨率越低。
2,圖像金字塔的分類
高斯金字塔(Gussianpyramid):用來下采樣,主要的圖像金字塔。
拉普拉斯金字塔(Laplacianpyramid):用來從金字塔底層圖像搭建上層未采樣圖像,上采樣重建一個圖像。在數(shù)字圖像處理中也即是預測殘差,可以對圖像進行最大程度的還原,配合高斯金字塔一起使用。
圖像金字塔中的向上和向下采樣分別通過OpenCv函數(shù)pyrUp和pyrDown實現(xiàn)。這里的向下與向上采樣,是對圖像的尺寸而言的(和金字塔的方向相反),即向下就是圖像尺寸縮小,向上是圖像尺寸變大。
高斯金字塔(縮小圖像)
為了獲取層級i+1層的高斯金字塔圖像,采取如下方法:
(1)對圖像i進行高斯內(nèi)核卷積;
(2)將所有偶數(shù)行和列去除;
得到的圖像即為i+1層的圖像,顯而易見,結(jié)果圖像只有原始圖像的四分之一。通過對圖像i層的不停迭代以上步驟就可以得到整個金字塔。同時可以發(fā)現(xiàn),向下取樣會逐漸丟失圖像的信息。
拉普拉斯金字塔(放大圖像)
(1)將圖像在每個方向擴大為原來的兩倍,新增的行和列以0填充;
(2)使用先前同樣的內(nèi)核(乘以四)與放大后的圖像卷積,獲得“新增像素”的值
得到的圖像即為放大后的圖像,但是與原來圖像相比發(fā)現(xiàn)會比較模糊,因為在縮放的過程中已經(jīng)丟失了一些信息,這些數(shù)據(jù)形成了拉普拉斯金字塔。也就是說,拉普拉斯金字塔是通過源圖像減去先縮小后放大的圖像的一些圖像構(gòu)成的。
拉普拉斯金字塔(放大圖像)用于重建圖像,也就是預測殘差(因為小圖像放大,必須插入一些像素值,那這些像素值是什么才合適呢,那就得進行根據(jù)周圍像素進行預測),對圖像進行最大程度的還原。比如一幅小圖像重建為一幅大圖像。上、下采樣都存在一個嚴重的問題,那就是圖像變模糊了,因為縮放的過程中發(fā)生了信息丟失的問題。要解決這個問題,就得看拉普拉斯金字塔了。Opencv可用:L(i)=G(i) - PyrUp(G(i+1));將降采樣之后的圖像再進行上采樣操作,然后與之前還沒降采樣的原圖進行做差得到殘差圖為還原圖像做信息的準備!
再提一點,關于圖像金字塔非常重要的一個應用就是實現(xiàn)圖像分割。圖像分割的話,先要建立一個圖像金字塔,然后在G_i和G_i+1的像素直接依照對應的關系,建立起”父與子“關系。而快速初始分割可以先在金字塔高層的低分辨率圖像上完成,然后逐層對分割加以優(yōu)化
另外,如果單純要做縮放就用resize函數(shù),很方便而且圖像不會變模糊!
源代碼示例:
import cv2 as cv
import numpy as npdef pyramid_demo(image): #圖像金字塔level = 3 #定義金字塔的層數(shù)temp = image.copy()pyramid_images = [] #金字塔圖像listfor 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) #數(shù)組長度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()
運行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的OpenCV+python:图像金字塔的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV+python:图像二值化
- 下一篇: 老郎酒53度多少钱一瓶