要想实现对图片/视频的处理和操作,opencv是必须要掌握的重要工具包,本文从最基础的函数开始,介绍在opencv中常用的图像基本操作,后续将更新一些基于opencv的小项目。
pip install opencv-contrib-python
导入工具包即可,在python里面opencv名字为cv2
import cv2
import numpy as np
使用cv2.imread(),将图片路径写入即可,返回结果为numpy.ndarray格式,每个像素点的值在0到255之间,其shape分别表示(高,宽,通道),需要注意的是,正常图像为RGB通道,但是opencv读入的图片为BGR通道
img=cv2.imread("data/cat.jpg")
img.shape
# (414, 500, 3)
其实可选参数介绍
- cv2.IMREAD_COLOR 以彩图读取 默认即该模式
- cv2.IMREAD_GRAYSCALE 以灰度图读取
使用方法,彩色图有三个通道,但是灰度图为单一通道
img2=cv2.imread("data/cat.jpg",cv2.IMREAD_COLOR)
img3=cv2.imread("data/cat.jpg",cv2.IMREAD_GRAYSCALE)
print(img2.shape,img3.shape)
#(414, 500, 3) (414, 500)
cv2.cvtColor(参数1,参数2)
参数1:即待转换图片
参数2:转换模式,opencv提供了大量模式根据需求选择即可,此处以BRG彩色图转灰度图为例
img=cv2.imread("data/cat.jpg")
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(img.shape,img_gray.shape)
# (414, 500, 3) (414, 500)
cv2.imshow(参数1,参数2)
- 参数1:窗口名称
- 参数2::待展示图片
cv2.waitKey(参数1)
-参数1:等待时间,单位为ms,0则表示任意键终止
cv2.destroyAllWindows()
- 关闭所有窗口
需要注意的是以上三个函数一般配合使用,因此可以写成一个函数以简化代码。
cv2.imshow("The cat",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite(参数1,参数2)
- 参数1:保存的路径
- 参数2:待保存图片
使用示例
cv2.imwrite("save/test.png",img3)
cv2.VideoCapture(参数1)
- 参数1:可以直接写入路径读取本地视频,也可以写数字(0表示本机摄像头,1表示usb外接摄像头)
vc=cv2.VideoCapture("video.mp4")#读入视频
opencv处理视频的本质还是处理视频的每一帧图像,使用read()可以获取一帧
ret,frame=vc.read()
- ret:标志位,表示该帧是否成功读取
- frame:当前帧图像,当ret为False时,frame为None
由于read()执行一次仅能获取一帧图片,因此一般写入while True
循环获取每一帧,当ret为False
时break即可。
while True:
ret,frame=vc.read()
if ret == False:
break
cv2.imshow("frame",frame)
cv2.waitKey(1)
vc.release() # 将视频资源释放
cv2.destroyAllWindows() #关闭所有窗口
img=cv2.imread("data/cat.jpg")
b,g,r=cv2.split(img)
merge=cv2.merge((b,g,r))
cv2.copyMakeBorder(zxx_img,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
cv2.copyMakeBorder(参数1,参数2,参数3,参数4,参数5,参数6)
-参数1: 待填充图片
-参数2:上部填充大小
-参数3:下部填充大小
-参数4:左侧填充大小
-参数5:右侧填充大小
-参数6:填充类型其介绍如下
--BORDER_REPLICATE:复制法,也就是复制最边缘像素。
--BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
--BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
--BORDER_WRAP:外包装法abcdefgh|abcdefgh|abcdefgh
--BORDER_CONSTANT:常量法,常数值填充。
使用示例及结果
#指定上下左右填充大小
top,bottom,left,right=60,60,60,60
BORDER_REPLICATE=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
BORDER_REFLECT=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
BORDER_REFLECT_101=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_REFLECT_101)
BORDER_WRAP=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
BORDER_CONSTANT=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=0)
# 绘图
cv2.imshow("orign",img)
cv2.imshow("BORDER_REPLICATE",BORDER_REPLICATE)
cv2.imshow("BORDER_REFLECT",BORDER_REFLECT)
cv2.imshow("BORDER_REFLECT_101",BORDER_REFLECT_101)
cv2.imshow("BORDER_WRAP",BORDER_WRAP)
cv2.imshow("BORDER_CONSTANT",BORDER_CONSTANT)
cv2.waitKey(0)
cv2.destroyAllWindows()
dst=cv2.resize(src,size)
- dst:调整后的图片
- src:需要调整的图片
- size:调整后的大小,元组类型例如(120,90)
按比例调整用法示例,下面代码表示,横轴变为原来4倍,纵轴变为2倍,使用该方法时要把size设为0
dst=cv2.resize(src,(0,0),fx=4,fy=2)
cv2.addWeighted(img1,weight1,img2,weight2,const)
-img1:图片1
-weight1:图片1的权重
-img2:图片2
-weight2:图片2的权重
-const:常数
以下行代码为例,其返回值img_cat_dog=img_cat*0.4+img_dog*0.6+0
img_cat_dog=cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)
一般使用其完成二值图转换
ret, dst = cv2.threshold(src, thresh, maxval, type)
- ret: 输入的thresh值。
- src: 输入图,只能输入单通道图像,通常来说为灰度图
- dst: 输出图
- thresh: 阈值
- maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定)时所赋予的值
- type:二值化操作的类型,包含以下5种类型:
-- cv2.THRESH_BINARY 超过阈值部分取maxval,否则取0
-- cv2.THRESH_BINARY_INV THRESH_BINARY的反转
-- cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
-- cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
-- cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转
可以理解为将待处理像素点周围n*m
个像素点相加后取平均,将其作为当前像素点滤波结果
n和m是卷积核大小,kernel_size=(n,m)
blur=cv2.blur(img,(3,3))#输入卷积核大小 一般是奇数
box=cv2.boxFilter(img,-1,(5,5),normalize=True)#-1指的是自动计算,保持颜色通道一致
# (5,5) 还是卷积核大小
GaussianBlur=cv2.GaussianBlur(img,(5,5),20,1)#后俩参数为均值和标准差大小
medianBlur=cv2.medianBlur(img,3)#选择每多少个点进行一次中位数计算
最近由于一直在学习新内容,而且本人加入羊群刚恢复不久,不知不觉已经好久没更新了,本文介绍了opencv一些基本处理,在下一篇文章中将继续介绍opencv的形态学处理