当前位置:   article > 正文

【OpenCV-Python】——图像处理基础&读写及显示图像&读写及播放视频&灰度图/彩色图/图像通道操作、运算_python opencv读取图像

python opencv读取图像

目录

前言:

1、读并显示图像、写图像

2、读并播放视频、写视频

3、操作灰度图和彩色图、图像通道操作、运算

总结:


前言:

在Python中,OpenCV使用NumPy数组存储图像,Numpy是使用Python进行数组计算的软件包,提供强大的N维数组对象,支持复杂的广播功能(数组运算),集成了C/C++和Fortran代码工具,支持线性代数、傅里叶变换和随机数等特性,还可作为通用数据的高效多维容器,如在OpenCV中显示图像。

Numpy的知识点见数据处理专栏,主要包括数据类型、创建数组、数组形状、索引切片和迭代、数组运算等。

1、读并显示图像、写图像

imread将文件夹的图像读入内存,支持BMP、PNG、JPEG、TIFF等静态图像格式,该函数返回的是一个numpy.ndarray对象(即NumPy数组),元素为图像像素,数组的shape(形状)、dtype(数据类型)、size(元素个数)等属性表示图像的相关属性。

常见基本读取格式有cv2.IMREAD_UNCHANGE(按原样加载)、cv2.IMREAD_GRAYSCALE(将图像转换为单通道灰度图像)、cv2.IMREAD_COLOR(将图像转换为3通道BGR彩图)等。

imwrite将Numpy数组中保存的图像写入文件,函数返回的是一个布尔值,写入成功返回true反之false。

  1. import cv2
  2. import numpy as np
  3. img1=cv2.imread('autumn.jpg')#可加读取格式参数
  4. cv2.imshow('autumn',img)
  5. cv2.waitKey(0)
  6. cv2.destroyAllWindows()
  7. #也可打包成一个函数
  8. def cv_show(name,img):
  9. cv2.imshow(name,img)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows()
  12. cv_show('autumn',img1)
  13. #写入一个50x50的黑色正方形图像
  14. img2=numpy.zeros((5050),dtype=numpy.uint8)
  15. cv2.imwrite("rectangle.png",img2)

2、读并播放视频、写视频

视频处理基本步骤:将视频文件或者摄像头作为数据源来创建VideoCapture对象;调用VideoCapture对象的read()方法获取视频中的帧,每一帧都是一幅图像;调用VideoWriter对象的write()方法将帧写入视频文件,或者调用cv2.imshow()函数直接在窗口显示帧。

  1. #播放文件已有的视频
  2. import cv2
  3. cap=cv2.VideoCapture("test.mp4")#创建对象
  4. #fps=cap.get(cv2.CAP_PROP_FPS)#读取帧速率
  5. #size=(cap.get(cv2.CAP_PROP_FRAME_HEIGHT),cap.get(cv2.CAP_PROP_FRAME_WIDTH))#读取视频大小
  6. #print('帧速率:',fps)
  7. #print('大小:',size)
  8. ret, frame = cap.read()#从视频中读取一帧数据,frame存储了此一帧数据
  9. while True:
  10. cv2.imshow('img',frame)
  11. ret, frame = cap.read()#从视频中读取一帧数据,frame存储了此一帧数据
  12. key = cv2.waitKey(1000//24)#延时时间:1000ms显示24张图片,最多等待1000//24毫秒
  13. if key == ord('q'):#按q退出
  14. break
  15. cap.release()#关闭视频
  1. #将已有的视频写入文件
  2. import cv2
  3. cap=cv2.VideoCapture("test.mp4")#创建对象,test.mp4是已存在的视频
  4. fps=cap.get(cv2.CAP_PROP_FPS)#读取帧速率
  5. size=(int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)),int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))#读取视频大小,int强制转换
  6. wrt=cv2.VideoWriter('test2.avi',cv2.VideoWriter_fourcc('X','V','I','D'),fps,size)#保存文件名,视频解码器格式,帧速率,大小
  7. ret, frame = cap.read()#读取一帧数据,frame存储了此一帧数据,ret是返回的布尔值
  8. while ret:
  9. wrt.write(frame)
  10. ret, frame = cap.read()
  11. cap.release()#关闭视频
  1. #捕获摄像头视频,保存并播放
  2. import cv2
  3. cap=cv2.VideoCapture(0)#创建对象,0代表视频源是摄像头
  4. fps=30 #预设帧速率
  5. size=(int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)),int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))#读取视频大小
  6. wrt=cv2.VideoWriter('test2.avi',cv2.VideoWriter_fourcc('X','V','I','D'),fps,size)#保存文件名,视频解码器格式,帧速率,大小
  7. ret, frame = cap.read()#从视频中读取一帧数据,frame存储了此一帧数据
  8. while ret:
  9. wrt.write(frame)#将帧写入文件
  10. cv2.imshow('img',frame)
  11. ret, frame = cap.read()#从视频中读取一帧数据,frame存储了此一帧数据
  12. key = cv2.waitKey(1000//24)#延时时间:1000ms显示24张图片,最多等待1000//24毫秒
  13. if key == ord('q'):#按q退出
  14. break
  15. cap.release()#关闭视频(释放摄像头)

3、操作灰度图和彩色图、图像通道操作、运算

灰度图为256级(0-255),0代表黑色,255为白色,一个字节存储一个像素值,用单通道的二维数组表示图像。像素点值不会大于255,若大于会按256取模。

  1. #代码示例:首先闯将240x320的黑色图像,并输出当前灰度值。每过1秒,灰度值增加20,直到按下esc退出
  2. img=numpy.zeros((240,320),dtype=numpy.uint8)
  3. n=0
  4. while true:
  5. cv2.imshow('Grayimg',img)
  6. n+=20
  7. img[:,:]=n#将所有像素点值修改为n
  8. print(img[1,1])
  9. key=cv2.waitKey(1000)
  10. if key==27:
  11. break

彩图RGB三个通道,每个通道的取值范围都是0-255,三个通道像素组合表示彩色图像,但opencv中默认图像格式是BGR,用三维数组表示彩色图像。

  1. #代码示例:三条颜色动态变化效果
  2. img=numpy.zeros((240,320,3),dtype=numpy.uint8)#240是宽,320是长
  3. r0=0
  4. r1=1
  5. r2=2
  6. while true:
  7. img[:80,:,r0]=255 #通道r0,将上部1/3颜色值设置为255
  8. img[80:160,:,r1]=255 #通道r1,将中部部1/3颜色值设置为255
  9. img[160:,:,r2]=255 #通道r2,将下部1/3颜色值设置为255
  10. cv2.imshow('Colorimg',img)
  11. key=cv2.waitKey(1000)
  12. img[:,:,:]=0 #清零变为黑色图像
  13. t=r0 #轮换通道
  14. r0=r1
  15. r1=r2
  16. r2=t
  17. if key==27:
  18. break

通道操作即对色彩通道进行拆分和合并,opencv中BGR格式的图像是三维数组,可用数组索引操作拆分通道。spilt分离、merge合并

  1. b,g,r = cv2.split(img3)#分离cv2的BGR颜色通道索引为0,1,2,matplotlib为RBG
  2. #print(b,g,r)#一串矩阵
  3. #print(r.shape)
  4. img4=cv2.merge((b,g,r))#合并B、G、R单通道为三通道彩色图像
  5. #print(img4.shape)
  6. cur_img1=img3.copy()
  7. cur_img1[:,:,1]=0
  8. cur_img1[:,:,2]=0
  9. cv_show('B',cur_img1)#只保留B通道
  10. cur_img2=img3.copy()
  11. cur_img2[:,:,0]=0
  12. cur_img2[:,:,2]=0
  13. cv_show('G',cur_img2)#只保留G通道
  14. cur_img3=img3.copy()
  15. cur_img3[:,:,0] = 0
  16. cur_img3[:,:,1] = 0
  17. cv_show('R',cur_img3)#只保留R通道

运算分加法运算、加权加法运算、位运算。加法运算有“+”和cv2.add()函数两种,“+”执行后如果结果大于256则会按256取模;cv2.add()执行后若结果大于256则会取255。加权加法用函数cv2.addWeighted(图1,权重1,图2,权重2,附加值)。位运算有按位与cv2.bitwise_and(图一,图二,mask)、按位或bitwise_or、按位取反bitwise_not、按位异或bitwise_xor四种。按位与常用于创建掩模图像。

总结:

作为初学者,里面可能有总结不全,后续深入学习后会改善文章!下次学习图形用户界面

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号