计算机眼中的图像由一个个像素组成, 每个像素点的值在0-255之间,代表像素点的亮度(0为最暗,255为最亮)。通常彩色图为三通道,灰度图(黑白图)为单通道。彩色图像包括三个颜色通道——B,G,R,分别表示蓝、绿、红。

目录

1.图像的表示

2.图像的读取

3.显示图片

4.色彩空间

5.图像的逐点操作(像素级操作)

6.图像二值化

7.几何变换-缩放

8.几何变换-平移

9.几何变换-旋转

10.视频读取和写入
​​​​​​​


1.图像的表示

图像的高和宽代表图像在竖直和水平方向分别有多少个像素点。也等价于每个颜色通道矩阵的维度。每张图片都是像素值构成的多维数组,彩色图像为三维数组,灰度图为二维数组


opencv库是开源图像处理和计算机视觉算法库,不同于其他库的是,其终端下载命令为pip install opencv-python,导入库的代码是import cv2


2.图像的读取

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=(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),即横坐标在前,纵坐标在后

•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如果有用户输入,返回输入的字符,否则返回-1char = cv2.waitKey(5)if char != -1:break# 读取新视频success, frame = cam.read()# 释放视频读取对象
cam.release()
# 释放视频写入对象
cam_write.release()

opencv图像处理及视频处理基本操作相关推荐

  1. Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取

    Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取 Java OpenCV-4.0.0 图像处理 视频分析和对象跟踪 视频读取 package com.xu.opencv.video; ...

  2. OpenCV图像处理--给视频添加水印

    打开摄像头后,接下来是想在画面上添加水印,图片之类.类似于电视画面上的台标. 如下是OpenCV官方文档给出的关于addWeighted的例子.能够将两幅图像添加到一起,但是要求尺寸是一样的.如下分别 ...

  3. python+opencv调用摄像头视频图像处理

    在做深度学习的时候,难免会用到摄像头采集图像.在这个就会用到python调用摄像头+opencv图像处理.视频图像的处理和单幅图片处理是一样的,视频就是很多单幅图像连续播放.每秒播放(采集)的图片数量 ...

  4. Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...

  5. OpenCV图像处理(14)—— 图像转视频

    引言 有个项目,需要将osg生成的批量图像转成视频:特点是,图像自带编号,类似于: Ir_Scene_339.jpg 的格式. 操作中,使用OpenCV自带的video函数完成. void Image ...

  6. OpenCv图像处理之图像视频摄像头读取和保存

    OpenCv图像处理之图像视频摄像头读取与保存 使用cv::imread()读取图片 使用cv::imwrite()存储图片 使用cv::VideoCapture::open()读取视频 使用cv:: ...

  7. Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景

    Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景 方法 含义 解释 bitwise_and "与"操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制 ...

  8. 【OpenCV图像处理入门学习教程五】基于背景差分法的视频目标运动侦测

    OpenCV图像处理入门学习教程系列,上一篇第四篇:基于LoG算子的图像边缘检测 运动目标检测 关于运动目标检测的方法总结,目前能够实现运动物体检测的方法主要有以下几种: 1)背景差分法:能完整快速地 ...

  9. 免费送书啦!《 OpenCV图像处理入门与实践》一本全搞定

    OpenCV 的基础图像操作都只是针对图像中的像素点,并不是直接对图像整体进行的操作.而很多时候并不能仅通过改变像素点来进行图像的操作,为此我们需要学习关于图像的算术操作. 1.图像加法 对于两张相同 ...

  10. opencv图像处理总结

    opencv图像处理基本操作 1. 矩阵数据类型 通用矩阵数据类型: CV_<bit_depth>(S|U|F)C<number_of_channels> 其中,S表示带符号整 ...

最新文章

  1. chatscript_如何使用ChatScript构建您的第一个聊天机器人
  2. Struts2文件上传方式与上传失败解决方式
  3. 隐藏头视图即隐藏UINavigationBar
  4. SAP 业务常用表的收集
  5. 【数据结构与算法】之深入解析“最大矩形”的求解思路和算法示例
  6. 关于如何用od反汇编win32 控制台程序
  7. c# 傅里叶变换 频域_傅里叶变换在MATLAB中的应用(频域滤波)
  8. ubuntu两个conda安装和切换
  9. Qt之利用事件过滤器在QLabel上画框
  10. Java Scanner 类,获取用户输入的值
  11. 省市三级联动(数据库)
  12. 把 14 亿中国人都拉到一个微信群,在技术上能实现吗?
  13. android 图片 3d 动画,DEMO:transition3d、运用动画实现图片3d翻转效果
  14. linux vi dd命令详解,Linux dd命令详解:数据备份,并在备份过程中进行格式转换...
  15. mysql 1032 update_解决mysql 1032 主从错误
  16. SzNOI语法百题之1-10
  17. Seurat-单细胞文献复现第二弹-02
  18. 基于Vue实现的网页音乐播放器
  19. metaball公式_parametric.是什么意思
  20. QT+opencv环境搭建

热门文章

  1. Android 视频和图片轮播控件,仿淘宝商品详情页
  2. Openwrt PPTP ALG功能
  3. [已解决]踩过的坑之mysql连接报“Communications link failure”错误
  4. MES1.0实现分析 -制造业数字化探讨(1)
  5. 二箱:比谷歌识图更全面,多引擎以图搜图工具
  6. 在centos中安装qq音乐
  7. 使用Travis CI实现C++ CMake工程多平台编译
  8. Ubuntu18.04 用一条命令 快速安装 FBReader
  9. css实现两端对齐的方法(先借鉴别人的,后期再加入自己的理解)
  10. 【禁用U盘】电脑windows7/10注册表、组策略禁用优盘;