目錄
一、numpy
1、定義
2、庫
3、ndarray的創建
4、函數
(1)arange 區間
(2)linspace 等差數列
(3)zeros 全0矩陣
(4)ones 全1矩陣
(5)自定義規則生成ndarray
5、屬性
(1)dtype
(2)shape
(3)size
(4)ndim
(5)itemsize
6、切片索引
7、截取圖片
8、numpy廣播
9、圖片改變
(一)翻轉
(二)裁剪
(三)圖片變亮變暗
二、Pandas(待補充)
運行速度非常快的數學庫
引入庫並重命名
import numpy as np #重命名
0軸 1軸 2軸。。。?
a=np.array([1,2,3,4],dtype=float)
print(a)
#[1. 2. 3. 4.]
參數(和list差不多):(start,end,step)---起始數字,結束數字,間隔區間
:浮點數2.0到3.0之間產生五個數,故每隔0.25輸出一個數
aa = np.linspace(2.0, 3.0, num=5)
print(aa)
#[2. 2.25 2.5 2.75 3. ]
# 全1矩陣
b=np.ones((3,3),np.int)
print(b,type(b))
#[[1 1 1]
#[1 1 1]
#[1 1 1]] <class 'numpy.ndarray'>
# 自定義規則生成ndarray
def func(i):
return i % 4 + 1
res=np.fromfunction(func, (10,))
print(res)
#[1. 2. 3. 4. 1. 2. 3. 4. 1. 2.]
每個元素的屬性
#沒有指明類型
a=np.array([1,2,3,4])
print(a)
#[1 2 3 4]
#指明dtype=float
a=np.array([1,2,3,4],dtype=float)
print(a)
#[1. 2. 3. 4.]
例1:讀取圖片的維度
img=cv2.imread("lyf.jpg")
print(img,type(img),img.shape)
# ...
# [126 112 113]
# [145 131 132]
# [137 123 124]]] <class 'numpy.ndarray'> (461, 438, 3)
例2:普通矩陣的維度
q = np.array([[1,2,3,4],[5,6,7,8],[7,8,9,10]])
print(q.shape)
#(3, 4)
#矩陣q為三行四列
元素個數
數組維度
(1)訪問元素(和list差不多(start,end,step))
# 切片
s=np.arange(10)
print(s) #[0 1 2 3 4 5 6 7 8 9]
print(s[...]) #全部元素[0 1 2 3 4 5 6 7 8 9]
print(s[::-1]) #全部元素倒序[9 8 7 6 5 4 3 2 1 0]
print(s[7:1:-2]) #從7到1 每個兩個元素打印一個,不取1[7 5 3]
(2)修改元素
#修改索引為4、5、6、7的元素
s[4:8]=45,46,57,67
print(s)
#[ 0 1 2 3 45 46 57 67 8 9]
#從4開始到8(不取8)每個兩個元素修改一個元素
s[4:8:2]=45,46
print(s)
#[ 0 1 2 3 45 5 46 7 8 9]
使用級聯分類器
(1)找到haarcascade_frontalface_alt2.xml文件拉到工程目錄下
(2)創建級聯分類器對象
detector=cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
(3)檢測圖片 detectMultiScale()
faces=detector.detectMultiScale(img,1.3,3)
print(faces)
"""
它可以檢測出圖片中所有的人臉,並將人臉用vector保存各個人臉的坐標、大小(用矩形表示),函數由分類器對象調用:
detectMultiScale
(
self,
image, #要檢測的圖片
scaleFactor=None, #縮放比例 1.1、1.3
minNeighbors=None, #構成檢測目標的相鄰矩形的最小個數,默認值是3 奇數(1,3,5)
flags=None, #是否可縮放
minSize=None, #限制得到的目標區域的范圍。
maxSize=None #限制得到的目標區域的范圍。
)
"""
(4)截取人臉區域並顯示
for x,y,width,height in faces:
img=img[y:y+height,x:x+width]
cv2.imshow("face",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果:
完整代碼
# 截取圖片
import cv2
img=cv2.imread("lyf.jpg")
print(img,type(img),img.shape)
#創建級聯分類器對象
detector=cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
#檢測圖片
faces=detector.detectMultiScale(img,1.3,3)
print(faces)
#截取人臉區域
for x,y,width,height in faces:
img=img[y:y+height,x:x+width]
cv2.imshow("face",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
(1)關於X軸對稱(上下翻轉)
import cv2
img=cv2.imread("ysjx.png")
cv2.imshow("1",img)
# cv2上下顛倒
img1=img[::-1]
cv2.imshow("X",img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)關於Y軸對稱
:表示行全部,::-1表示列逆序,所以形成水平翻轉
# 圖片左右翻轉 :表示行全部,::-1表示列逆序,所以形成水平翻轉
img2=img[:,::-1]
(3)關於原點對稱(上下左右都翻轉)
# 沿著原點 行列都逆序
img3=img[::-1,::-1]
全部代碼:
import cv2
img=cv2.imread("ysjx.png")
cv2.imshow("1",img)
# 沿著x軸 上下顛倒:行逆序
img1=img[::-1]
# 沿著Y軸 圖片左右翻轉 :表示行全部,::-1表示列逆序,所以形成水平翻轉
img2=img[:,::-1]
# 通道改變,變成灰色
# img3=img[:,:,-1]
# 沿著原點 行列都逆序
img3=img[::-1,::-1]
cv2.imshow("X",img1)
cv2.imshow("Y",img2)
cv2.imshow("0",img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
(1)截取下半段
與高度有關---行數×0.5(轉換為int型)
#截取下半段
img4=img[int(0.5*img.shape[0]):]
(2)截取左半段
與寬度有關---列數×0.5(轉換為int型)
img5=img[:,:int(0.5*img.shape[1])]
全部代碼:
import cv2
img=cv2.imread("ysjx.png")
cv2.imshow("1",img)
# 沿著x軸 上下顛倒:行逆序
img1=img[::-1]
# 沿著Y軸 圖片左右翻轉 :表示行全部,::-1表示列逆序,所以形成水平翻轉
img2=img[:,::-1]
# img3=img[:,:,-1]
# 沿著原點 行列都逆序
img3=img[::-1,::-1]
#截取下半段
img4=img[int(0.5*img.shape[0]):]
img5=img[:,:int(0.5*img.shape[1])]
# cv2.imshow("X",img1)
# cv2.imshow("Y",img2)
# cv2.imshow("0",img3)
cv2.imshow("bottom",img4)
cv2.imshow("left",img5)
cv2.waitKey(0)
cv2.destroyAllWindows()
(3)截取行數(每隔一行抽取一行)
#抽取行數截取
img6=img[::2]
cv2.imshow("hg2",img6)
(1)圖片變暗(img*0.5 不一定是整數,故要處理)
img7=(0.5*img).astype(np.uint8)
cv2.imshow("dark",img7)
(2)圖片變亮(不能單純的*2,因為很有可能*2後大於255,故要處理)
img8=np.clip(1.5*img,a_min=0.,a_max=255.).astype(np.uint8)
cv2.imshow("bling",img8)
(6)bgr轉rgb(通道改變)
上述處理都是bgr模式
(7)灰度處理(待補充)