目錄
3、numpy中的reval(散開、解開)函數、flatten(變平)函數和reshape()函數
1、imread函數
語法:
import cv2
img = cv2.imread('image.jpg')
print(img)
[[[ 33 26 103]
[ 34 21 100]
[ 34 15 98]
...
[ 74 98 118]
[ 64 89 106]
[ 57 85 101]]
[[ 33 27 102]
[ 33 23 101]
[ 33 18 100]
...
[ 90 124 145]
[ 77 109 128]
[ 67 98 115]]
[[ 33 27 101]
[ 33 24 101]
[ 33 21 101]
...
[103 146 170]
[ 92 130 153]
[ 81 118 137]]
...
[[252 198 154]
[255 212 162]
[255 221 170]
...
[136 111 91]
[112 77 57]
[ 79 38 23]]
[[243 181 139]
[247 193 145]
[251 206 157]
...
[133 111 91]
[116 84 64]
[ 88 50 33]]
[[239 177 139]
[242 183 140]
[249 199 153]
...
[127 109 92]
[113 86 68]
[ 90 57 41]]]
cv2.imread在不加第二個參數的情況下默認將圖片轉換成了一個三維數組,
最裏面的一維代表的是一個像素的三個通道的灰度值,
第二個維度代表的是第一行所有像素的灰度值,
第三個維度,也就是最外面的一個維度代表的是這一張圖片。
imread函數有兩個參數,第一個參數是圖片路徑,第二個參數表示讀取圖片的形式,有三種:
- cv2.IMREAD_COLOR:加載彩色圖片,這個是默認參數,可以直接寫1。
- cv2.IMREAD_GRAYSCALE:以灰度模式加載圖片,可以直接寫0。
- cv2.IMREAD_UNCHANGED:包括alpha,可以直接寫-1。
2、calcHist函數
計算圖像灰度直方圖
圖像的灰度直方圖可以統計出圖像中的每一個像素的灰度值在整個圖像中出現的次數
如上圖就是一個圖像的灰度直方圖,橫座標代表的是像素值的範圍:[0,255],越接近0表示越黑,越接近255表示圖像越亮。縱座標代表的是每一個灰度值在圖像所有像素中出現的次數。柱狀圖越高,表示該像素值在圖像中出現的次數越多。
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
參數:
- hist表示直方圖,返回的是一個二維數組
- images表示原始圖像
- channels表示指定通道,通道編號需要用中括號括起,輸入圖像是灰度圖像時,它的值爲[0],彩色圖像則爲[0]、[1]、[2],分別表示B、G、R
- mask表示掩碼圖像,統計整副圖像的直方圖設爲None;統計圖像的某一部分直方圖時,需要掩碼圖像
- histSize表示BINS的數量,參數子集的數目,
- ranges表示像素值範圍,例如[0, 255]
- accumulate表示累計疊加標識,默認爲false,如果被設置爲true,則直方圖在開始分配時不會被清零,該參數允許從多個對象中計算單個直方圖,或者用於實時更新直方圖;多個直方圖的累積結果用於對一組圖像的直方圖計算
import cv2
from matplotlib import pyplot as plt
# 計算直方圖
img = cv2.imread('low1.png',0)
hist = cv2.calcHist([img],[0],None,[256],[0,255])
# 畫出直方圖
plt.figure()
plt.title("Grayscale Histogram")
plt.xlabel("Bins")
plt.ylabel("number of Pixels")
plt.plot(hist)
plt.xlim([0,256])
plt.show()
3、numpy中的reval(散開、解開)函數、flatten(變平)函數和reshape()函數
reval和faltten函數的功能是一樣的:將多維數組降爲一維。
區別是:
- numpy.flatten()返回一份拷貝,對拷貝的數據所做的修改不會影響(reflects)原始矩陣,
- numpy.ravel()返回的是視圖(view,也頗有幾分C/C++引用reference的意味),對視圖後所做的數據修改會影響(reflects)原始矩陣的數據。
- reshape()函數當參數只有一個且爲-1時,表示將數組降爲一維。
#兩者功能
In [14]: x=np.array([[1,2],[3,4]])
# flattenh函數和ravel函數在降維時默認是行序優先
In [15]: x.flatten()
Out[15]: array([1, 2, 3, 4])
In [17]: x.ravel()
Out[17]: array([1, 2, 3, 4])
# 傳入'F'參數表示列序優先
In [18]: x.flatten('F')
Out[18]: array([1, 3, 2, 4])
In [19]: x.ravel('F')
Out[19]: array([1, 3, 2, 4])
#reshape函數當參數只有一個-1時表示將數組降爲一維
In [21]: x.reshape(-1)
Out[21]: array([1, 2, 3, 4])
#x.T表示x的轉置
In [22]: x.T.reshape(-1)
Out[22]: array([1, 3, 2, 4])
#flatten函數返回的是拷貝,修改返回的a之後原始的數據x並未改變。
>>> x = np.array([[1, 2], [3, 4]])
>>> a = x.flatten()
>>> a[1] = 100
>>>> a
array([ 1, 100, 3, 4])
>>> x
array([[1, 2],
[3, 4]])
#ravel返回的是視圖,修改返回的數據a之後,x的內容值也會發生相應改變。
>>> x = np.array([[1, 2], [3, 4]])
>>> a = x.ravel()
>>> a
array([1, 2, 3, 4])
>>> a[1] = 100
>>> a
array([ 1, 100, 3, 4])
>>> x
array([[ 1, 100],
[ 3, 4]])