计算机眼中的图像由一个个像素组成, 每个像素点的值在0-255之间,代表像素点的亮度(0为最暗,255为最亮)。通常彩色图为三通道,灰度图(黑白图)为单通道。彩色图像包括三个颜色通道——B,G,R,分别表示蓝、绿、红。目录
1.图像的表示
2.图像的读取
3.显示图片
4.色彩空间
5.图像的逐点操作(像素级操作)
6.图像二值化
7.几何变换-缩放
8.几何变换-平移
9.几何变换-旋转
10.视频读取和写入
???????
1.图像的表示 图像的高和宽代表图像在竖直和水平方向分别有多少个像素点。也等价于每个颜色通道矩阵的维度。每张图片都是像素值构成的多维数组,彩色图像为三维数组,灰度图为二维数组。
文章图片
opencv库是开源图像处理和计算机视觉算法库,不同于其他库的是,其终端下载命令为pip install opencv-python,导入库的代码是import cv22.图像的读取
cv2.imread(filepath, flag)
? filepath : 文件路径,不能包含中文
? flag:读取的模式(可选)
flag参数值 缩写参数值 含义 cv.IMREAD_UNCHANGED -1 按原样返回加载的图像(如果有透明
通道则保留)cv.IMREAD_GRAYSCALE 0 始终将图像转换为单通道灰度图像 cv.IMREAD_COLOR (默认) 1 始终将图像转换为3通道BGR彩色图
像。
#读取图片(路径不能包含中文)
img=cv2.imread("C:\\Users\\Administrator\\desk\\images\\lena02.png")
print(img)#打印像素
print(img.shape)#(高,宽,通道)
3.显示图片
cv2.imshow(windowname, img)
? windowname : 显示的窗口名,字符串形式
? img:要显示的图片
#显示结果
cv2.imshow("img",img)
cv2.waitKey()#等待键盘输入,输入任意键返回
cv2.destroAllyWindow()#关闭窗口
4.色彩空间
dst = cv2.cvtColor(src, code)
? src: 输入图像
? code:转换模式,例如cv2.COLOR_BGR2GRAY,
cv2.COLOR_BGR2HSV,数字2的前后分别是转换前和转换后
的色彩空间
文章图片
#转换为灰度图
gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)#数字2的前后分别是转换前和转换后的色彩空间
print(gray.shape)#转换为三通道图
img=cv2.cvtColor(gray,cv2.COLOR_RGB2BGR)
print(gray.shape)
5.图像的逐点操作(像素级操作)
访问图片中某一特定像素的像素值
? 彩色图像:[行编号,列编号,通道编号]
? 灰度图像:[行编号,列编号]
访问图像某个局部区域:图像裁剪(通过切片实现)
? 通过切片的方式得到图片的某一部分
局部区域有时也称为ROI(Region Of Interest)
#获取局部区域(roi)
roi=img[384:513,350:550]
#保存roi到roi1.jpg
cv2.imwrite("roi1.jpg", roi)
6.图像二值化 二值图像:
? 图像上像素点的灰度值只有两种(一般是0和255)
? 更好地分析物体的形状和轮廓
? 也常作为掩码图像(mask)
图像二值化:
? 将图像变为二值图像的操作
retval, dst = cv2.threshold(src, thresh, maxval, thresholdType)? dst:结果图像
? src:原图像,要求必须是灰度图像
? thresh:阈值,取值范围0~255
? maxVal:像素灰度最大值(最大阈值)
? thresholdType:阈值类型,如下图THRESH_BINARY类型,修改后原图像像素小于127的值会会变成0,大于127的值会变成255
- retval: 返回输入的thresh
- dst: 返回二值化后的图片
文章图片
img=cv2.imread("D:\\desk\\images\\lena02.png",0)#0:自动将图像转为灰度图
ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
运行结果如下:
文章图片
7.几何变换-缩放
res = cv2.resize(src, size, fx, fy, interpolation)
?src: 原图
?size:目标的宽和高,格式为(w,h),w和h均为整数
?fx, fy(可选):沿x轴,y轴的缩放系数,当指定这两个数值时,size需输入None
Interpolation(可选):缩放的方式,具体含义见下表
cv2.INTER_NEAREST 最近邻插值 cv2.INTER_LINEAR 双线性插值(默认设置) cv2.INTER_AREA 使用像素区域关系进行重采样 cv2.INTER_CUBIC 4x4像素邻域的双三次插值 cv2.INTER_LANCZOS4 8x8像素邻域的Lanczos插值
img=cv2.imread("C:\\Users\\Administrator\\desk\\images\\lena02.png")
print(img.shape)#计算宽和高
#方法1
w=int(0.5*img.shape[1])
h=int(0.6*img.shape[0])
img_small=cv2.resize(img,(w,h))
#方法2
img_small=cv2.resize(img,None,fx=0.5,fy=0.6)#res = cv2.resize(src, size, fx, fy, interpolation(可选))
print(img.shape)
8.几何变换-平移
dst = cv2.warpAffine(src, M, dsize[,flags,borderMode,borderValue])
?src:输入图像
?M:2*3变换矩阵,float32
文章图片
文章图片
tx:水平方向的平移距离ty:垂直方向的平移距离
?dsize:输出图像的大小,格式为(w,h)
?Flags(可选):插值方法,默认为cv2.INTER_LINEAR(即线性插值)
?borderMode(可选):边的类型
?borderValue(可选):边界值,默认为0
#定义变换矩阵
tx=50#水平方向的平移距离
ty=50#垂直方向的平移距离
M=np.float32([[1,0,tx],[0,1,ty]])#移动图像
lena_shift=cv2.warpAffine(img,M,(img.shape[1],img.shape[0]),borderValue=https://www.it610.com/article/(255,255,255))
#borderValue定义颜色dsize:(img.shape[1],img.shape[0])为输出图像的大小,格式为(w,h)
9.几何变换-旋转
cv2.warpAffine()除了平移外,还可以实现旋转效果
输入图片和输出大小预先设定,已知
只需要确定M矩阵:cv2.getRotationMatrix2D(center, angle, scale)
?center:输入图像的旋转中心,格式为(x,y),即横坐标在前,纵坐标在后
【python|opencv图像处理及视频处理基本操作】?angle:旋转角(以度为单位),注意:逆时针旋转角为正,顺时针旋转角为负
?scale:原始图像的缩放系数
h,w,_=img.shape#定义旋转中心
center_x=int(w/2)
center_y=int(h/2)#得到变换矩阵,逆时针旋转30,缩放到原图0.6倍
M=cv2.getRotationMatrix2D((center_x,center_y),30,0.6)#旋转中心,旋转角,缩放系数#调用warpAffine进行旋转
res=cv2.warpAffine(img,M,(w,h))
10.视频读取和写入
OpenCV中的视频读取步骤:
?1.cam = cv2.VideoCapture() 创建视频捕获器
?2.cam.read() 读取视频帧,每次调用都返回读取是否成功和当前帧(失败的话为None)
有两种读取失败的可能:视频损坏、已读到最后一帧
?3.cam.release() 释放视频捕获器
OpenCV中的视频写入步骤:
?1.定义新视频的宽、高、帧率
?2.创建新视频的编码器cv2.VideoWriter_fourcc
?3. 创建新视频的写入对象cv2.VideoWriter
?4.逐帧写入新视频: .write(frame)?5.释放VideoWriter对象: .release()
OpenCV中的获取视频属性: VideoCapture对象的.get()方法
get参数 含义 cv2.CAP_PROP_FRAME_WIDTH 视频帧的宽 cv2.CAP_PROP_FRAME_HEIGHT 视频帧的高 cv2.CAP_PROP_FPS 视频帧的帧率
编码器初始化fourcc= cv2.VideoWriter_fourcc(fourcc_name)
?fourcc: 编码器对象
?fourcc_name:编码器名称,格式为*'编码器',例如*'mp4v',*'DIVX'.
视频写入对象的初始化vw= cv2.VideoWriter(path, fourcc, fps, frame_size)
?path:保存路径
?fourcc:编码器对象
?fps:帧率
?frame_size:视频帧宽和高,格式为(w,h)
"""将一段视频读取进来,并且将读入的视频帧写到新视频,如果用户有按键输入,则停止写入"""
import cv2
# 第一步:读取视频
# 创建视频捕获器cam = cv2.VideoCapture("D:\\desk\\chp3.mp4")# 确定视频高 宽 帧率视频总帧数
height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH))
fps = round(cam.get(cv2.CAP_PROP_FPS))
frameCount=cam.get(cv2.CAP_PROP_FRAME_COUNT)# 创建视频编码器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')# 对应的编码器为MP4v
cam_write = cv2.VideoWriter("C:\\Users\\Administrator\\desk\\output.mp4", fourcc, fps, (width, height))# 第二步:循环得到视频帧,并写入新视频
success, frame = cam.read()
frame_count=0#当前写入
# 读取视频帧
while success:
# 将视频帧写入新视频
cam_write.write(frame)
cv2.imshow("frame", frame)
# 判断用户是否有按键输入,如果有则跳出循环
# cv2.waitKey如果有用户输入,返回输入的字符,否则返回-1
char = cv2.waitKey(5)
if char != -1:
break
# 读取新视频
success, frame = cam.read()# 释放视频读取对象
cam.release()
# 释放视频写入对象
cam_write.release()
推荐阅读
- 数字图像MATLAB|TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作
- #|论文笔记(Fine-Grained Visual Classification via PMG Training of Jigsaw Patches)
- 数据增强|细粒度识别 DCL 论文及代码学习笔记
- ModuleNotFoundError No module named 'PIL'问题解决
- 工具|opencv Ubuntu上环境搭建
- opencv|Ubuntu下Opencv的安装(亲测有效,超级简单!)
- python|计算聚类系数clustering coefficient的python实现
- python|PyTorch入门,帮你构建自己的神经网络模型
- FPGA|FPGA实验记录四(基于FPGA的VGA协议实现)