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

目录

前言:

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。

import cv2
import numpy as np
img1=cv2.imread('autumn.jpg')#可加读取格式参数
cv2.imshow('autumn',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

#也可打包成一个函数
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

cv_show('autumn',img1)

#写入一个50x50的黑色正方形图像
img2=numpy.zeros((50,50),dtype=numpy.uint8)
cv2.imwrite("rectangle.png",img2)

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

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

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

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

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

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

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

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

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

b,g,r = cv2.split(img3)#分离cv2的BGR颜色通道索引为0,1,2,matplotlib为RBG
#print(b,g,r)#一串矩阵
#print(r.shape)
img4=cv2.merge((b,g,r))#合并B、G、R单通道为三通道彩色图像
#print(img4.shape)
cur_img1=img3.copy()
cur_img1[:,:,1]=0
cur_img1[:,:,2]=0
cv_show('B',cur_img1)#只保留B通道
cur_img2=img3.copy()
cur_img2[:,:,0]=0
cur_img2[:,:,2]=0
cv_show('G',cur_img2)#只保留G通道
cur_img3=img3.copy()
cur_img3[:,:,0] = 0
cur_img3[:,:,1] = 0
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四种。按位与常用于创建掩模图像。

总结:

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯宝最帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值