什么是圖像金字塔?
圖像金字塔(Image> Pyramid)是一種用于多尺度圖像處理和分析的技術(shù),它通過構(gòu)建一系列不同分辨率的圖像,從而使得圖像可以在不同尺度下進(jìn)行處理和分析。圖像金字塔在計(jì)算機(jī)視覺、圖像處理和計(jì)算機(jī)圖形學(xué)等領(lǐng)域中廣泛應(yīng)用,可以用于目標(biāo)檢測(cè)、特征提取、圖像匹配、尺度不變特征變換(SIFT)等任務(wù)。
圖像金字塔通常分為兩種類型:高斯金字塔和拉普拉斯金字塔。
-
高斯金字塔(Gaussian Pyramid):高斯金字塔通過不斷降采樣(縮?。┰紙D像來構(gòu)建,每一層圖像都是前一層圖像的一半大小。降采樣可以通過平均像素值或使用高斯濾波器來實(shí)現(xiàn)。高斯金字塔在圖像縮放、分割、模糊等任務(wù)中有用。
-
拉普拉斯金字塔(Laplacian Pyramid):拉普拉斯金字塔是通過從高斯金字塔中的每一層圖像減去其上一層的上采樣圖像得到的。這一過程使得每一層圖像包含了高頻成分,即圖像細(xì)節(jié)。拉普拉斯金字塔在圖像增強(qiáng)、壓縮、圖像融合等方面有用。
使用圖像金字塔,可以在不同尺度下對(duì)圖像進(jìn)行處理,從而能夠更好地應(yīng)對(duì)圖像中存在的不同尺度的特征。例如,在目標(biāo)檢測(cè)中,可以使用圖像金字塔來檢測(cè)不同大小的目標(biāo)物體。在SIFT等特征提取方法中,金字塔可以幫助提取出尺度不變的特征點(diǎn)。
總之,圖像金字塔是一種重要的多尺度處理工具,能夠在圖像分析和處理中提供更豐富的信息,以適應(yīng)不同尺度的特征和任務(wù)。
應(yīng)用場(chǎng)景:
圖像金字塔在計(jì)算機(jī)視覺、圖像處理和計(jì)算機(jī)圖形學(xué)等領(lǐng)域中有許多應(yīng)用場(chǎng)景,下面列舉了一些常見的應(yīng)用場(chǎng)景:
-
目標(biāo)檢測(cè):在目標(biāo)檢測(cè)任務(wù)中,物體可能以不同的尺度出現(xiàn)在圖像中。使用圖像金字塔可以在不同尺度下進(jìn)行檢測(cè),從而識(shí)別不同大小的目標(biāo)物體。
-
特征提?。阂恍┨卣魈崛》椒?,如尺度不變特征變換(SIFT)、尺度不變特征點(diǎn)檢測(cè)(SURF)等,需要在不同尺度下提取特征。圖像金字塔可以幫助提取出尺度不變的特征點(diǎn)和描述符。
-
圖像匹配與對(duì)準(zhǔn):在圖像配準(zhǔn)和匹配任務(wù)中,圖像可能存在縮放、旋轉(zhuǎn)等變換。使用圖像金字塔可以在不同尺度下進(jìn)行匹配和對(duì)準(zhǔn),提高匹配的準(zhǔn)確性和魯棒性。
-
圖像融合:將兩幅圖像融合成一幅圖像時(shí),可能需要考慮圖像的尺度和細(xì)節(jié)。圖像金字塔可以幫助在不同尺度下融合圖像,實(shí)現(xiàn)平滑的過渡和自然的融合效果。
-
圖像增強(qiáng)與去噪:在圖像增強(qiáng)和去噪任務(wù)中,可以通過圖像金字塔在不同尺度下對(duì)圖像進(jìn)行處理,實(shí)現(xiàn)局部增強(qiáng)和噪聲抑制。
-
縮放與旋轉(zhuǎn):對(duì)于圖像的縮放和旋轉(zhuǎn)操作,圖像金字塔可以幫助實(shí)現(xiàn)平滑的過渡和保留圖像細(xì)節(jié)。
-
紋理分析:在紋理分析任務(wù)中,不同尺度下的紋理特征可能會(huì)影響分析結(jié)果。圖像金字塔可以用于提取不同尺度下的紋理特征。
-
圖像壓縮:在圖像壓縮中,可以使用金字塔結(jié)構(gòu)來分析圖像的不同尺度特征,從而更有效地進(jìn)行壓縮編碼。
實(shí)現(xiàn)原理:
圖像金字塔是由一幅圖像的多個(gè)不同分辨率的子圖所構(gòu)成的圖像集合。該組圖像是由單個(gè)圖像通過不斷地降采樣所產(chǎn)生的,最小的圖像可能僅僅有一個(gè)像素點(diǎn)。
圖 11-1 是一個(gè)圖像金字塔的示例。從圖中可以看到,圖像金字塔是一系列以金字塔形狀排列的、自底向上分辨率逐漸降低的圖像集合。
通常情況下,圖像金字塔的底部是待處理的高分辨率圖像(原始圖像),而頂部則為其低分辨率的近似圖像。向金字塔的頂部移動(dòng)時(shí),圖像的尺寸和分辨率都不斷地降低。通常情況下,每向上移動(dòng)一級(jí),圖像的寬和高都降低為原來的二分之一。
圖像金字塔是同一圖像不同分辨率的子圖集合,是通過對(duì)原圖像不斷地向下采樣而產(chǎn)生的,即由高分辨率的圖像(大尺寸)產(chǎn)生低分辨率的近似圖像(小尺寸)。
最簡(jiǎn)單的圖像金字塔可以通過不斷地刪除圖像的偶數(shù)行和偶數(shù)列得到。例如,有一幅圖像,其大小是 NN,刪除其偶數(shù)行和偶數(shù)列后得到一幅(N/2)(N/2)大小的圖像。經(jīng)過上述處理后,圖像大小變?yōu)樵瓉淼乃姆种?,不斷地重?fù)該過程,就可以得到該圖像的圖像金字塔。
也可以先對(duì)原始圖像濾波,得到原始圖像的近似圖像,然后將近似圖像的偶數(shù)行和偶數(shù)列刪除以獲取向下采樣的結(jié)果。有多種濾波器可以選擇。例如:
- 鄰域?yàn)V波器:采用鄰域平均技術(shù)求原始圖像的近似圖像。該濾波器能夠產(chǎn)生平均金字塔。
- 高斯濾波器:采用高斯濾波器對(duì)原始圖像進(jìn)行濾波,得到高斯金字塔。這是
OpenCV 函數(shù) cv2.pyrDown()
所采用的方式。
高斯金字塔是通過不斷地使用高斯金字塔濾波、采樣所產(chǎn)生的,其過程如圖 11-2 所示。
經(jīng)過上述處理后,原始圖像與各次向下采樣所得到的結(jié)果圖像共同構(gòu)成了高斯金字塔。
例如,可以將原始圖像稱為第 0 層,第 1 次向下采樣的結(jié)果圖像稱為第 1 層,第 2 次向下采樣的結(jié)果圖像稱為第 3 層,以此類推。上述圖像所構(gòu)成的高斯金字塔如圖 11-3 所示。在本章中為了便于表述,統(tǒng)一將圖像金字塔中的底層稱為第 0 層,底層上面的一層稱為第 1 層,并以此類推。
---------------------------------------------------------------------
在向上采樣的過程中,通常將圖像的寬度和高度都變?yōu)樵瓉淼?2 倍。這意味著,向上采樣的結(jié)果圖像的大小是原始圖像的 4 倍。因此,要在結(jié)果圖像中補(bǔ)充大量的像素點(diǎn)。對(duì)新生成的像素點(diǎn)進(jìn)行賦值,稱為插值處理,該過程可以通過多種方式實(shí)現(xiàn),例如最臨近插值就是用最鄰
近的像素點(diǎn)給當(dāng)前還沒有值的像素點(diǎn)賦值。
有一種常見的向上采樣,對(duì)像素點(diǎn)以補(bǔ)零的方式完成插值。通常是在每列像素點(diǎn)的右側(cè)插入值為零的列,在每行像素點(diǎn)的下方插入值為零的行。在圖 11-4 中,左側(cè)是要進(jìn)行向上采樣的4 個(gè)像素點(diǎn),右側(cè)是向上采樣時(shí)進(jìn)行補(bǔ)零后的處理結(jié)果。
接下來,使用向下采樣時(shí)所用的高斯濾波器(高斯核)對(duì)補(bǔ)零后的圖像進(jìn)行濾波處理,以獲取向上采樣的結(jié)果圖像。但是需要注意,此時(shí)圖像中四分之三像素點(diǎn)的值都是零。所以,要將高斯濾波器系數(shù)乘以 4,以保證得到的像素值范圍在其原有像素值范圍內(nèi)。
例如,針對(duì)圖 11-4 右側(cè)的像素點(diǎn),其對(duì)應(yīng)的是 8 位圖像,像素值的范圍是[0, 255]。由于其中四分之三的像素點(diǎn)的值都為零,如果直接使用高斯濾波器對(duì)其進(jìn)行卷積計(jì)算,會(huì)導(dǎo)致像素值的范圍變?yōu)閇0, 255*1/4]。
所以,要將所使用的高斯濾波器系數(shù)乘以 4,以保證得到像素值的范圍仍舊在[0, 255]內(nèi)。
或者,從另一個(gè)角度理解,在原始圖像內(nèi)每個(gè)像素點(diǎn)的右側(cè)列插入零值列,在每個(gè)像素點(diǎn)的下一行插入零值行,將圖像變?yōu)樵瓉淼膬杀秾挕杀陡?。接下來,將補(bǔ)零后的圖像用向下采樣時(shí)所使用的高斯濾波器進(jìn)行卷積運(yùn)算。最后,將圖像內(nèi)每個(gè)像素點(diǎn)的值乘以 4,以保證像素值的范圍與原始圖像的一致。
通過以上分析可知,向上采樣和向下采樣是相反的兩種操作。但是,由于向下采樣會(huì)丟失像素值,所以這兩種操作并不是可逆的。也就是說,對(duì)一幅圖像先向上采樣、再向下采樣,是無法恢復(fù)其原始狀態(tài)的;同樣,對(duì)一幅圖像先向下采樣、再向上采樣也無法恢復(fù)到原始狀態(tài)。
pyrDown 函數(shù)及使用
OpenCV 提供了函數(shù) cv2.pyrDown()
,用于實(shí)現(xiàn)圖像高斯金字塔操作中的向下采樣,其語法形式為:
dst = cv2.pyrDown( src[, dstsize[, borderType]] )
其中:
- dst 為目標(biāo)圖像。
- src 為原始圖像。
- dstsize 為目標(biāo)圖像的大小。
- borderType 為邊界類型, 默認(rèn)值為 BORDER_DEFAULT , 且這里僅 支 持BORDER_DEFAULT。
默認(rèn)情況下,輸出圖像的大小為 Size((src.cols+1)/2, (src.rows+1)/2)。在任何情況下,圖像尺寸必須滿足如下條件:
|dst. width ? 2 ? src. cols|≤2
|dst. height ? 2 ? src. rows|≤2
cv2.pyrDown()函數(shù)首先對(duì)原始圖像進(jìn)行高斯濾波變換,以獲取原始圖像的近似圖像。比如,高斯濾波變換所使用的核(高斯濾波器)為:
在獲取近似圖像后,該函數(shù)通過拋棄偶數(shù)行和偶數(shù)列來實(shí)現(xiàn)向下采樣。
代碼示例
使用函數(shù) cv2.pyrDown()對(duì)一幅圖像進(jìn)行向下采樣,觀察采樣的結(jié)果。
import cv2
o=cv2.imread("lena.png",cv2.IMREAD_GRAYSCALE)
r1=cv2.pyrDown(o)
r2=cv2.pyrDown(r1)
r3=cv2.pyrDown(r2)
print("o.shape=",o.shape)
print("r1.shape=",r1.shape)
print("r2.shape=",r2.shape)
print("r3.shape=",r3.shape)
cv2.imshow("original",o)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey()
cv2.destroyAllWindows()
使用 cv2.pyrDown()函數(shù)進(jìn)行了 3 次向下采樣,并且用 print()函數(shù)輸出了每次采樣結(jié)果圖像的大小。cv2.imshow()函數(shù)顯示了原始圖像和經(jīng)過 3 次向下采樣后得到的結(jié)果圖像。
運(yùn)行結(jié)果:
o.shape= (512, 512)
r1.shape= (256, 256)
r2.shape= (128, 128)
r3.shape= (64, 64)
從上述結(jié)果可知,經(jīng)過向下采樣后,圖像的行和列的數(shù)量都會(huì)變?yōu)樵瓉淼亩种?,圖像整體的大小會(huì)變?yōu)樵瓉淼乃姆种弧_@里為了便于比較,將它們調(diào)整成了等高格式展示。通過圖像的比例關(guān)系,可以推斷出各個(gè)圖像的大致尺寸比例
pyrUp 函數(shù)及使用
OpenCV 中,使用函數(shù) cv2.pyrUp()實(shí)現(xiàn)圖像金字塔操作中的向上采樣,其語法形式如下:
dst = cv2.pyrUp( src[, dstsize[, borderType]] )
其中:
- dst 為目標(biāo)圖像。
- src 為原始圖像。
- dstsize 為目標(biāo)圖像的大小。
- borderType 為邊界類型, 默認(rèn)值為 BORDER_DEFAULT , 且這里僅 支 持BORDER_DEFAULT。
默認(rèn)情況下,目標(biāo)圖像的大小為 Size(src.cols*2, src.rows*2)
。
在任何情況下,圖像尺寸需要滿足下列條件:
|dst. width ? src. cols ? 2|≤mod(dst. widh, 2)
|dst. height ? src. rows ? 2|≤mod(dst. height, 2)
對(duì)圖像向上采樣時(shí),在每個(gè)像素的右側(cè)、下方分別插入零值列和零值行,得到一個(gè)偶數(shù)行、偶數(shù)列(即新增的行、列)都是零值的新圖像 New。接下來,用向下采樣時(shí)所使用的高斯濾波器對(duì)新圖像 New 進(jìn)行濾波,得到向上采樣的結(jié)果圖像。需要注意的是,為了確保像素值區(qū)間在向上采樣后與原始圖像保持一致,需要將高斯濾波器的系數(shù)乘以 4。
上一段描述的是 OpenCV 函數(shù) cv2.pyrUp()所實(shí)現(xiàn)的向上采樣過程。了解上述過程,有助于我們更好地理解和使用該函數(shù)。
但是,OpenCV 庫(kù)的目的就是要讓我們忽略這些細(xì)節(jié),直接使
用函數(shù) cv2.pyrUp()完成向上采樣。所以,在剛開始的學(xué)習(xí)階段,我們也可以先忽略這些細(xì)節(jié)。
代碼示例:
import cv2
o=cv2.imread("lena.png")
r1=cv2.pyrUp(o)
r2=cv2.pyrUp(r1)
r3=cv2.pyrUp(r2)
print("o.shape=",o.shape)
print("r1.shape=",r1.shape)
print("r2.shape=",r2.shape)
print("r3.shape=",r3.shape)
cv2.imshow("original",o)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey()
cv2.destroyAllWindows()
運(yùn)行結(jié)果:
o.shape= (512, 512, 3)
r1.shape= (1024, 1024, 3)
r2.shape= (2048, 2048, 3)
r3.shape= (4096, 4096, 3)
從上述輸出結(jié)果可知,經(jīng)過向上采樣后,圖像的寬度和高度都會(huì)變?yōu)樵瓉淼?2 倍,圖像整體大小會(huì)變?yōu)樵瓉淼?4 倍。
采樣可逆性的研究
圖像在向上采樣后,整體尺寸變?yōu)樵瓉淼?4 倍;在向下采樣后,整體尺寸變?yōu)樵瓉淼乃姆种弧?/p>
圖 11-7 展示了圖像在采樣前后的大小變化關(guān)系。一幅 MN 大小的圖像經(jīng)過向下采樣后大小會(huì)變?yōu)?M/2)(N/2);一幅 MN 大小的圖像經(jīng)過向上采樣后大小會(huì)變?yōu)?2M)(2N)。
一幅圖像在先后經(jīng)過向下采樣和向上采樣后,會(huì)恢復(fù)為原始大小,如圖 11-8 所示。
雖然一幅圖像在先后經(jīng)過向下采樣、向上采樣后,會(huì)恢復(fù)為原始大小,但是向上采樣和向下采樣不是互逆的。也就是說,雖然在經(jīng)歷兩次采樣操作后,得到的結(jié)果圖像與原始圖像的大小一致,肉眼看起來也相似,但是二者的像素值并不是一致的。
代碼示例:
使用函數(shù) cv2.pyrDown()和 cv2.pyrUp(),先后將一幅圖像進(jìn)行向下采樣、向上采樣,觀察采樣的結(jié)果及結(jié)果圖像與原始圖像的差異。
import cv2
o=cv2.imread("lena.png")
down=cv2.pyrDown(o)
up=cv2.pyrUp(down)
diff=up-o #構(gòu)造 diff 圖像,查看 up 與 o 的區(qū)別
print("o.shape=",o.shape)
print("up.shape=",up.shape)
cv2.imshow("original",o)
cv2.imshow("up",up)
cv2.imshow("difference",diff)
cv2.waitKey()
cv2.destroyAllWindows()
運(yùn)行結(jié)果:
o.shape= (512, 512, 3)
up.shape= (512, 512, 3)
文章來源:http://www.zghlxwxcb.cn/news/detail-643665.html
- 左圖是原始圖像 o。
- 中間圖是對(duì)圖像 down(通過對(duì)原始圖像 o 向下采樣得到)進(jìn)行向上采樣后獲得的結(jié)果圖
像 up。 - 右圖是對(duì)圖像 up 和原始圖像 o 進(jìn)行減法運(yùn)算的結(jié)果(差值)圖像 diff。圖像 diff 反映的是圖像 up 和原始圖像 o 的差值。
本例在嘗試向大家說明,原始圖像先后經(jīng)過向下采樣、向上采樣后,所得到的結(jié)果圖像與原始圖像的大小一致,看起來也很相似,但是它們的像素值并不是一致的。文章來源地址http://www.zghlxwxcb.cn/news/detail-643665.html
到了這里,關(guān)于opencv基礎(chǔ)45-圖像金字塔01-高斯金字塔cv2.pyrDown()的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!