文章目录
前言
要想实现对图片/视频的处理和操作,opencv是必须要掌握的重要工具包,本文从最基础的函数开始,介绍在opencv中常用的图像基本操作,后续将更新一些基于opencv的小项目。
一、opencv 安装
pip install opencv-contrib-python
导入工具包即可,在python里面opencv名字为cv2
import cv2
import numpy as np
二、常见基本操作
1.图片读取
使用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)
2.颜色转换
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)
3.图像展示
cv2.imshow(参数1,参数2)
- 参数1:窗口名称
- 参数2::待展示图片
cv2.waitKey(参数1)
-参数1:等待时间,单位为ms,0则表示任意键终止
cv2.destroyAllWindows()
- 关闭所有窗口
需要注意的是以上三个函数一般配合使用,因此可以写成一个函数以简化代码。
cv2.imshow("The cat",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下
4.图片保存
cv2.imwrite(参数1,参数2)
- 参数1:保存的路径
- 参数2:待保存图片
使用示例
cv2.imwrite("save/test.png",img3)
5.视频数据读取
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() #关闭所有窗口
6.提取与合并颜色通道
- 再次强调 cv读取的顺序是BGR
6.1 提取颜色通道
img=cv2.imread("data/cat.jpg")
b,g,r=cv2.split(img)
6.2 合并颜色通道
merge=cv2.merge((b,g,r))
7.边界填充(pading)
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()
![](https://img-blog.csdnimg.cn/5057bc4a2e774b0ea6894f104b04dc01.png)
![](https://img-blog.csdnimg.cn/2dd5c3015b5540d7bee7be7c256b2785.png)
![](https://img-blog.csdnimg.cn/f198d9bb59b64d099277ac0f7fa28364.png)
![](https://img-blog.csdnimg.cn/3c832e4f73dc4db6b0fa8adea0267e37.png)
![](https://img-blog.csdnimg.cn/7e6ad5bf940448f092aa23fe6dede3cf.png)
![](https://img-blog.csdnimg.cn/b9d9c3ac37e942f280d47d7e8b0d267e.png)
8. 图像大小调整
dst=cv2.resize(src,size)
- dst:调整后的图片
- src:需要调整的图片
- size:调整后的大小,元组类型例如(120,90)
按比例调整用法示例,下面代码表示,横轴变为原来4倍,纵轴变为2倍,使用该方法时要把size设为0
dst=cv2.resize(src,(0,0),fx=4,fy=2)
9.图像融合
- 待融合图像需要大小一致
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)
10.图像阈值处理
一般使用其完成二值图转换
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的反转
11.图像平滑处理
- 其实就是各种滤波 去除噪音
11.1 均值滤波 :简单的平均卷积操作
可以理解为将待处理像素点周围n*m
个像素点相加后取平均,将其作为当前像素点滤波结果
n和m是卷积核大小,kernel_size=(n,m)
blur=cv2.blur(img,(3,3))#输入卷积核大小 一般是奇数
11.2 方框滤波 :基本和均值滤波一样,可以选择归一化 不归一化很容易越界 全亮 不好用
box=cv2.boxFilter(img,-1,(5,5),normalize=True)#-1指的是自动计算,保持颜色通道一致
# (5,5) 还是卷积核大小
11.3 高斯滤波 : 谁重要(距离当前像素点近) 谁的权重就大
GaussianBlur=cv2.GaussianBlur(img,(5,5),20,1)#后俩参数为均值和标准差大小
11.4 中值滤波 : 即排序找到中位数 然后用中位数作为滤波结果 去除雪花点噪音的效果最好
medianBlur=cv2.medianBlur(img,3)#选择每多少个点进行一次中位数计算
原始图像
三种滤波结果对比(均值 高斯 中值)
总结
最近由于一直在学习新内容,而且本人加入羊群刚恢复不久,不知不觉已经好久没更新了,本文介绍了opencv一些基本处理,在下一篇文章中将继续介绍opencv的形态学处理