日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV---图像金字塔原理

發(fā)布時(shí)間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV---图像金字塔原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

圖像金字塔原理

(一)圖像縮小(先高斯模糊,再降采樣,需要一次次重復(fù),不能一次到底)

(二)圖像擴(kuò)大(先擴(kuò)大,再卷積或者使用拉普拉斯金字塔)

圖像金字塔介紹

圖像金字塔是圖像中多尺度表達(dá)的一種,最主要用于圖像的分割,是一種以多分辨率來(lái)解釋圖像的有效但概念簡(jiǎn)單的結(jié)構(gòu)。簡(jiǎn)單來(lái)說(shuō),圖像金字塔就是用來(lái)進(jìn)行圖像縮放的。 進(jìn)行圖像縮放可以用圖像金字塔,也可以使用resize函數(shù)進(jìn)行縮放,后者效果更好。這里只是對(duì)圖像金字塔做一些簡(jiǎn)單了解。

金字塔類型:高斯和拉普拉斯

①高斯金字塔:用于下采樣。高斯金字塔是最基本的圖像塔。
原理:首先將原圖像作為最底層圖像G0(高斯金字塔的第0層),利用高斯核(5*5)對(duì)其進(jìn)行卷積,然后對(duì)卷積后的圖像進(jìn)行下采樣(去除偶數(shù)行和列)得到上一層圖像G1,
將此圖像作為輸入,重復(fù)卷積和下采樣操作得到更上一層圖像,反復(fù)迭代多次,形成一個(gè)金字塔形的圖像數(shù)據(jù)結(jié)構(gòu),即高斯金字塔。 ②拉普拉斯金字塔:用于重建圖像,也就是預(yù)測(cè)殘差,對(duì)圖像進(jìn)行最大程度的還原。比如一幅小圖像重建為一幅大圖,
原理:用高斯金字塔的每一層圖像減去其上一層圖像上采樣并高斯卷積之后的預(yù)測(cè)圖像,得到一系列的差值圖像即為 LP 分解圖像。

采樣類型:上采樣和下采樣

①上采樣:就是圖片放大(所謂上嘛,就是變大),使用PryUp函數(shù)。
上采樣步驟:先將圖像在每個(gè)方向放大為原來(lái)的兩倍,新增的行和列用0填充,再使用先前同樣的內(nèi)核與放大后的圖像卷積,獲得新增像素的近似值。 ②下采樣:就是圖片縮小(所謂下嘛,就是變小),使用PryDown函數(shù)。下采樣將步驟:先對(duì)圖像進(jìn)行高斯內(nèi)核卷積 ,再將所有偶數(shù)行和列去除。 總之,上、下采樣都存在一個(gè)嚴(yán)重的問題,那就是圖像變模糊了,因?yàn)榭s放的過程中發(fā)生了信息丟失的問題。要解決這個(gè)問題,就得用拉普拉斯金字塔。

一:使用高斯金字塔實(shí)現(xiàn)下采樣pyrDown

import cv2 as cv import numpy as npdef pyramid_demo(image):level = 3temp = image.copy()pyramid_images = []for i in range(level):dst = cv.pyrDown(temp) #先對(duì)圖像進(jìn)行高斯平滑,然后再進(jìn)行降采樣(將圖像尺寸行和列方向縮減一半)pyramid_images.append(dst)cv.imshow("pyramid_demo_%s"%i,dst)temp = dst.copy()src = cv.imread("./1.png") #讀取圖片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #創(chuàng)建GUI窗口,形式為自適應(yīng) cv.imshow("input image",src) #通過名字將圖像和窗口聯(lián)系 pyramid_demo(src) cv.waitKey(0) #等待用戶操作,里面等待參數(shù)是毫秒,我們填寫0,代表是永遠(yuǎn),等待用戶操作 cv.destroyAllWindows() #銷毀所有窗口

二:使用拉普拉斯金字塔

def pyramid_demo(image):level = 3temp = image.copy()pyramid_images = []for i in range(level):dst = cv.pyrDown(temp) #先對(duì)圖像進(jìn)行高斯平滑,然后再進(jìn)行降采樣(將圖像尺寸行和列方向縮減一半)pyramid_images.append(dst)cv.imshow("pyramid_demo_%s"%i,dst)temp = dst.copy()return pyramid_imagesdef lapalian_demo(image):pyramid_images = pyramid_demo(image)  #拉普拉斯需要用到高斯金字塔結(jié)果level = len(pyramid_images)for i in range(level-1,-1,-1): #從后向前2,1,0if (i-1) < 0:expand = cv.pyrUp(pyramid_images[i], dstsize=image.shape[:2])  #先上采樣lapls = cv.subtract(image, expand)  #使用高斯金字塔上一個(gè)減去當(dāng)前上采樣獲取的結(jié)果,才是拉普拉斯金字塔else:expand = cv.pyrUp(pyramid_images[i],dstsize=pyramid_images[i-1].shape[:2])lapls = cv.subtract(pyramid_images[i-1],expand)cv.imshow("lapls_down_%s"%i,lapls)src = cv.imread("./a1.jpg") #讀取圖片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #創(chuàng)建GUI窗口,形式為自適應(yīng) cv.imshow("input image",src) #通過名字將圖像和窗口聯(lián)系 lapalian_demo(src) cv.waitKey(0) #等待用戶操作,里面等待參數(shù)是毫秒,我們填寫0,代表是永遠(yuǎn),等待用戶操作 cv.destroyAllWindows() #銷毀所有窗口

嘗試直接輸出expand不去subtract

cv.imshow("lapls_down_%s"%i,expand)

變模糊了

注意:

我們選用的圖片大小必須是2^n大小,或者是一個(gè)寬高相等的圖片 OpenCV(3.4.1) Error: Assertion failed (std::abs(dsize.width - ssize.width*2) == dsize.width % 2 && std::abs(dsize.height - ssize.height*2) == dsize.height % 2) in cv::pyrUp_, file C:\projects\opencv-python\opencv\modules\imgproc\src\pyramids.cpp, line 996 Traceback (most recent call last):File "D:/MyPython/day25/pv/op11.py", line 35, in <module>lapalian_demo(src)File "D:/MyPython/day25/pv/op11.py", line 27, in lapalian_demoexpand = cv.pyrUp(pyramid_images[i],dstsize=pyramid_images[i-1].shape[:2]) cv2.error: OpenCV(3.4.1) C:\projects\opencv-python\opencv\modules\imgproc\src\pyramids.cpp:996: error: (-215) std::abs(dsize.width - ssize.width*2) == dsize.width % 2 && std::abs(dsize.height - ssize.height*2) == dsize.height % 2 in function cv::pyrUp_

相關(guān)知識(shí)補(bǔ)充:

(一)pyrDown降采樣

def pyrDown(src, dst=None, dstsize=None, borderType=None): # real signature unknown; restored from __doc__ opencv的pyrDown函數(shù)先對(duì)圖像進(jìn)行高斯平滑,然后再進(jìn)行降采樣(將圖像尺寸行和列方向縮減一半)。其函數(shù)原型為:pyrDown(src[, dst[, dstsize[, borderType]]]) -> dstsrc參數(shù)表示輸入圖像。dst參數(shù)表示輸出圖像,它與src類型、大小相同。dstsize參數(shù)表示降采樣之后的目標(biāo)圖像的大小。它是有默認(rèn)值的,如果我們調(diào)用函數(shù)的時(shí)候不指定第三個(gè)參數(shù),那么這個(gè)值是按照 Size((src.cols+1)/2, (src.rows+1)/2) 計(jì)算的。而且不管你自己如何指定這個(gè)參數(shù),一定必須保證滿足以下關(guān)系式:|dstsize.width * 2 - src.cols| ≤ 2; |dstsize.height * 2 - src.rows| ≤ 2。也就是說(shuō)降采樣的意思其實(shí)是把圖像的尺寸縮減一半,行和列同時(shí)縮減一半。borderType參數(shù)表示表示圖像邊界的處理方式。

(二)pyrUp上采樣

def pyrUp(src, dst=None, dstsize=None, borderType=None): # real signature unknown; restored from __doc__ opencv的pyrUp函數(shù)先對(duì)圖像進(jìn)行升采樣(將圖像尺寸行和列方向增大一倍),然后再進(jìn)行高斯平滑。其函數(shù)原型為:pyrUp(src[, dst[, dstsize[, borderType]]]) -> dstsrc參數(shù)表示輸入圖像。dst參數(shù)表示輸出圖像,它與src類型、大小相同。dstsize參數(shù)表示降采樣之后的目標(biāo)圖像的大小。在默認(rèn)的情況下,這個(gè)尺寸大小是按照 Size(src.cols*2, (src.rows*2) 來(lái)計(jì)算的。如果你自己要指定大小,那么一定要滿足下面的條件:|dstsize.width - src.cols * 2| ≤ (dstsize.width mod 2); //如果width是偶數(shù),那么必須dstsize.width是src.cols的2倍|dstsize.height - src.rows * 2| ≤ (dstsize.height mod 2);borderType參數(shù)表示表示圖像邊界的處理方式。

?

轉(zhuǎn)載于:https://www.cnblogs.com/ssyfj/p/9273643.html

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的OpenCV---图像金字塔原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。