圖像采樣處理
圖像采樣(Image Sampling)處理是將一幅連續(xù)圖像在空間上分割成M×N個網(wǎng)格茄菊,每個網(wǎng)格用一個亮度值或灰度值來表示.
圖像采樣的間隔越大,所得圖像像素數(shù)越少赊堪,空間分辨率越低面殖,圖像質(zhì)量越差,甚至出現(xiàn)馬賽克效應(yīng)哭廉;相反脊僚,圖像采樣的間隔越小,所得圖像像素數(shù)越多遵绰,空間分辨率越高辽幌,圖像質(zhì)量越好,但數(shù)據(jù)量會相應(yīng)的增大椿访。
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
img = cv2.imread('data/test3.jpg')
src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#獲取圖像高度和寬度
height = src.shape[0]
width = src.shape[1]
#采樣轉(zhuǎn)換成8*8區(qū)域
numHeight = height//16
numwidth = width//16
#創(chuàng)建一幅圖像
new_img = np.zeros((height, width, 3), np.uint8)
#圖像循環(huán)采樣16*16區(qū)域
for i in range(16):
#獲取Y坐標(biāo)
y = i*numHeight
for j in range(16):
#獲取X坐標(biāo)
x = j*numwidth
#獲取填充顏色 左上角像素點
b = src[y, x][0]
g = src[y, x][1]
r = src[y, x][2]
#循環(huán)設(shè)置小區(qū)域采樣
for n in range(numHeight):
for m in range(numwidth):
new_img[y+n, x+m][0] = np.uint8(b)
new_img[y+n, x+m][1] = np.uint8(g)
new_img[y+n, x+m][2] = np.uint8(r)
#顯示圖像
titles = ['src', 'Sampling']
images = [src, new_img]
plt.figure(figsize=(10, 4))
for i in range(2):
plt.subplot(1, 2, i+1)
plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
# 上述代碼存在一個問題乌企,當(dāng)圖像的長度和寬度不能被采樣區(qū)域整除時,輸出圖像的最右邊和最下邊的區(qū)域沒有被采樣處理
圖像金字塔
圖像金字塔是指由一組圖像且不同分別率的子圖集合成玫,它是圖像多尺度表達的一種加酵,以多分辨率來解釋圖像的結(jié)構(gòu)拳喻,主要用于圖像的分割或壓縮。一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐步降低猪腕,且來源于同一張原始圖的圖像集合冗澈。如圖所示,它包括了四層圖像码撰,將這一層一層的圖像比喻成金字塔渗柿。圖像金字塔可以通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣脖岛,在向下采樣中朵栖,層級越高,則圖像越小柴梆,分辨率越低陨溅。
生成圖像金字塔主要包括兩種方式——向下取樣、向上取樣绍在。在上圖中门扇,將圖像G0轉(zhuǎn)換為G1、G2偿渡、G3臼寄,圖像分辨率不斷降低的過程稱為向下取樣;將G3轉(zhuǎn)換為G2溜宽、G1吉拳、G0,圖像分辨率不斷增大的過程稱為向上取樣适揉。
圖像向下取樣
在圖像向下取樣中留攒,使用最多的是高斯金字塔。它將對圖像Gi進行高斯核卷積嫉嘀,并刪除原圖中所有的偶數(shù)行和列炼邀,最終縮小圖像。其中剪侮,高斯核卷積運算就是對整幅圖像進行加權(quán)平均的過程拭宁,每一個像素點的值,都由其本身和鄰域內(nèi)的其他像素值(權(quán)重不同)經(jīng)過加權(quán)平均后得到瓣俯。
高斯核卷積讓臨近中心的像素點具有更高的重要度红淡,對周圍像素計算加權(quán)平均值.原始圖像具有M×N個像素,進行向下取樣之后降铸,所得到的圖像具有M/2×N/2個像素,只有原圖的四分之一摇零。通過對輸入的原始圖像不停迭代以上步驟就會得到整個金字塔推掸。注意,由于每次向下取樣會刪除偶數(shù)行和列,所以它會不停地丟失圖像的信息谅畅。
dst = pyrDown(src[, dst[, dstsize[, borderType]]])
- src表示輸入圖像登渣,
- dst表示輸出圖像,和輸入圖像具有一樣的尺寸和類型
- dstsize表示輸出圖像的大小毡泻,默認值為Size()
- borderType表示像素外推方法
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
img = cv2.imread('data/test3.jpg')
src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#圖像向下取樣
r = cv2.pyrDown(src)
#顯示圖像
titles = ['src', 'Sampling']
images = [src, r]
plt.figure(figsize=(10, 4))
for i in range(2):
plt.subplot(1, 2, i+1)
plt.imshow(images[i], 'gray')
plt.title(titles[i])
# plt.xticks([]), plt.yticks([])
plt.show()
圖像向上取樣
在圖像向上取樣是由小圖像不斷放圖像的過程胜茧。它將圖像在每個方向上擴大為原圖像的2倍,新增的行和列均用0來填充仇味,并使用與“向下取樣”相同的卷積核乘以4呻顽,再與放大后的圖像進行卷積運算,以獲得“新增像素”的新值丹墨。
dst = pyrUp(src[, dst[, dstsize[, borderType]]])
- src表示輸入圖像廊遍,
- dst表示輸出圖像,和輸入圖像具有一樣的尺寸和類型
- dstsize表示輸出圖像的大小贩挣,默認值為Size()
- borderType表示像素外推方法
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
img = cv2.imread('data/test3.jpg')
src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#圖像向上取樣
r = cv2.pyrUp(src)
#顯示圖像
titles = ['src', 'pyrUp']
images = [src, r]
plt.figure(figsize=(10, 4))
for i in range(2):
plt.subplot(1, 2, i+1)
plt.imshow(images[i], 'gray')
plt.title(titles[i])
# plt.xticks([]), plt.yticks([])
plt.show()