天天看點

python opencv 圖像處理(八)

圖像金字塔

圖像金字塔是圖像多尺度表達的一種,是一種以多分辨率來解釋圖像的有效但概念簡單的結構。一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐漸降低,且來源于同一張原始圖的圖像集合。其通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣。我們将一層一層的圖像比喻成金字塔,層級越高,則圖像越小,分辨率越低。

  • cv2.pyrUp: 上采樣
  • cv2.pyrDown: 下采樣

有兩種經典的金字塔:高斯金字塔和拉普拉斯金字塔,前者采用向下采樣,後者是向上采樣需要的缺失的資訊。

向下采樣(生成高斯金字塔)的具體操作為: 從大到小

    1. 對圖像進行高斯卷積

    2. 删除所有的偶數行和偶數列

向上采樣的缺失資訊(生成拉普拉斯金字塔)的具體操作為:從小到大

    1. 首先将維數擴大兩倍

    2. 将擴大位的值置為0

    3. 對新的圖像進行高斯卷積

    4. 用新的層次的高斯金字塔減去 3 中形成的圖像

python opencv 圖像處理(八)
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()      
python opencv 圖像處理(八)
python opencv 圖像處理(八)
python opencv 圖像處理(八)

圖像進行上采樣,再下采樣,或者先下采樣,再上采樣,無法恢複原圖清晰度

直方圖

可以将直方圖視為圖形或者繪圖,進而總體了解圖像的強度分布。它是在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()      

繼續閱讀