目录
一、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)