程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python矩陣:【numpy、Panda】級聯分類器截取人臉區域顯示、圖片處理(翻轉、變亮變暗、截取)

編輯:Python

目錄

一、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(待補充)

一、numpy

1、定義

運行速度非常快的數學庫

2、庫

引入庫並重命名

import numpy as np #重命名

0軸 1軸 2軸。。。?

3、ndarray的創建

  • Numpy中的核心對象是ndarray
  • ndarray對維數沒有限制
a=np.array([1,2,3,4],dtype=float)
print(a)
#[1. 2. 3. 4.]

4、函數

(1)arange 區間

參數(和list差不多):(start,end,step)---起始數字,結束數字,間隔區間

(2)linspace 等差數列

:浮點數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. ]

(3)zeros 全0矩陣

(4)ones 全1矩陣

# 全1矩陣
b=np.ones((3,3),np.int)
print(b,type(b))
#[[1 1 1]
#[1 1 1]
#[1 1 1]] <class 'numpy.ndarray'>

(5)自定義規則生成ndarray

  • fromfunction第一個參數接收計算函數,第二個參數接收數組的形狀。
# 自定義規則生成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.]

5、屬性

(1)dtype

每個元素的屬性

#沒有指明類型
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.]

(2)shape 

例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為三行四列

(3)size

元素個數

(4)ndim

數組維度

(5)itemsize

6、切片索引

  • 通過索引或者切片有規律的查找指定位置的元素
  • 可以使用整數數組索引法對數組元素切片,這樣修改新的數組不會改變原來的數組

(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]

7、截取圖片

使用級聯分類器

(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()

8、numpy廣播

  • shape不同,只有其中一個是1維的時候才能廣播

9、圖片改變

(一)翻轉

(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)灰度處理(待補充)

二、Pandas(待補充)


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved