python矩阵:【numpy、Panda】级联分类器截取人脸区域显示、图片处理(翻转、变亮变暗、截取)

本文介绍了Python中numpy库的使用,包括ndarray的创建、函数、属性、切片索引以及图片处理技术,如图片翻转、裁剪、变亮变暗和灰度处理,并展示了如何将处理后的图片保存到本地。
摘要由CSDN通过智能技术生成

目录

一、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、图片改变

(一)翻转

(二)裁剪

(三)图片变亮变暗

(四)灰度处理

(五)将处理好的图片保存到项目本地


一、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)关于原点对称(上下左右都翻转)

 全部代码:

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)

 (四)灰度处理

1、numpy

# 灰度处理  gray = r*0.299 + g*0.587 + b*0.114 加权求和
img9=img[:,:,2]*0.299+img[:,:,1]*0.587+img[:,:,1]*0.114
# 像素点必须是整数,img9做转换处理
img9 = img9.astype(np.uint8)

cv2.imshow("Gray_numpy",img9)

 2、cv2

# 2使用opencv做灰度处理
img_gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
print("img_gray",img_gray,type(img_gray))

cv2.imshow("Gray_cv2",img_gray)

 3、对比

# 灰度处理  gray = r*0.299 + g*0.587 + b*0.114 加权求和
img9=img[:,:,2]*0.299+img[:,:,1]*0.587+img[:,:,1]*0.114
# 像素点必须是整数,img9做转换处理
img9 = img9.astype(np.uint8)
# 2使用opencv做灰度处理
img_gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
print("img9",img9,type(img9))
print("img_gray",img_gray,type(img_gray))

cv2.imshow("Gray_numpy",img9)
cv2.imshow("Gray_cv2",img_gray)

(五)将处理好的图片保存到项目本地

cv2.imwrite("img_gray.png",img_gray)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值