圖像金字塔
圖像金字塔是圖像多尺度表達的一種,是一種以多分辨率來解釋圖像的有效但概念簡單的結構。一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐漸降低,且來源于同一張原始圖的圖像集合。其通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣。我們将一層一層的圖像比喻成金字塔,層級越高,則圖像越小,分辨率越低。
- cv2.pyrUp: 上采樣
- cv2.pyrDown: 下采樣
有兩種經典的金字塔:高斯金字塔和拉普拉斯金字塔,前者采用向下采樣,後者是向上采樣需要的缺失的資訊。
向下采樣(生成高斯金字塔)的具體操作為: 從大到小
1. 對圖像進行高斯卷積
2. 删除所有的偶數行和偶數列
向上采樣的缺失資訊(生成拉普拉斯金字塔)的具體操作為:從小到大
1. 首先将維數擴大兩倍
2. 将擴大位的值置為0
3. 對新的圖像進行高斯卷積
4. 用新的層次的高斯金字塔減去 3 中形成的圖像
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM2MDM0QWNzUmNzcjYyQjYyYzXxMTO1YTMzIzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
import cv2
import numpy as np
img = cv2.imread('data.jpg')
up = cv2.pyrUp(img) # 上采樣
down = cv2.pyrDown(img) # 下采樣
cv2.imshow('img',img)
cv2.imshow('up',up)
cv2.imshow('down',down)
cv2.waitKey(0)
cv2.destroyAllWindows()
圖像進行上采樣,再下采樣,或者先下采樣,再上采樣,無法恢複原圖清晰度
直方圖
可以将直方圖視為圖形或者繪圖,進而總體了解圖像的強度分布。它是在x軸上具有像素值(0~255的範圍),在y軸上具有圖像中相應像素值的數量。
cv2.calcHist(images,channels,mask,histSize,ranges)
- images: 原圖像圖像格式為 uint8 或 float32。當傳入函數時應 用中括号 [] 括來例如[img]
- channels:同樣用中括号括來它會告函數我們統幅圖 像的直方圖。如果入圖像是灰階圖它的值就是 [0]如果是彩色圖像 的傳入的參數可以是[0][1][2] 它們分别對應着 BGR。
- mask: 掩模圖像。統整幅圖像的直方圖就把它為 None。但是如果你想統圖像某一分的直方圖的你就制作一個掩模圖像并 使用它。
- histSize:BIN 的數目,也應用中括号括來
- ranges:像素值範圍常為 [0-256]
import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
img = cv2.imread('data.jpg',0) #0表示灰階圖
hist = cv2.calcHist([img],[0],None,[256],[0,256])
# hist.shape # (256,1) 256指0-255的256個像素; 1指1維,像素x 多少多少個
plt.hist(img.ravel(),256); # 此處不顯示圖像,用plt展示友善,若用cv2,要進行顔色轉換
plt.show()
img = cv2.imread('data.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()