OpenCV-Python3.OpenCV的图像基础操作
Posted 机器视觉小学徒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-Python3.OpenCV的图像基础操作相关的知识,希望对你有一定的参考价值。
3.OpenCV的图像基础操作
前言
OpenCV的imread()、imwrite()、imshow()函数分别用于读写和显示图像。VideoCapture类和VideoWriter类提供了视频处理能力,支持各种格式的视频文件。
计算机在处理图像信息时,将灰度处理为256级(0~255),0表示黑色,255表示白色,用一个字节来存储一个像素值。OpenCV使用单通道的二维数组来表示灰度图像。对于彩色通道,颜色的表示方法有所不同,可以根据公式相互转化。例如R、G、B通道,用3个通道的像素组合表示彩色图像。在OpenCV中可以对图像的彩色通道进行拆分和合并(需要注意的是OpenCV默认的图像格式为BGR)。
一、读、写、显示图像
使用OpenCV-Python处理图像时,实现不同的功能,程序有基本的模板。导入必要的包后,按照固定的模板稍作修改就可以实现想要的功能。
首先,导入必要的包。
import cv2
import numpy as np
import matplotlib.pyplot as plt
(1) 使用imread()读取图像时,可根据需要修改图像读取格式标志。
image1 = cv2.imread('parrot.png',cv2.IMREAD_COLOR) # 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志
image2 = cv2.imread('parrot.png',cv2.IMREAD_GRAYSCALE) # 以灰度模式加载图像
image3 = cv2.imread('parrot.png',cv2.IMREAD_UNCHANGED) # 加载图像,包括alpha通道
# 注意,除了这三个标志,也可以分别传递整数1、0或-1。
(2) 使用imread()读取RGB图像,利用 matplotlib.pyplot显示图像。
image = cv2.imread('lena.jpg', cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换颜色通道
plt.imshow(image)
plt.axis('off')
plt.show()
(3) 使用imread()读取灰度图像,利用imshow()显示图像。
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('IMREAD_GRAYSCALE', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
(4) 使用imread()读取灰度图像,利用imshow()显示图像,并进行imwrite()保存图像。
image = cv2.imread('lena.jpg', cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.namedWindow('IMAGE', cv2.WINDOW_NORMAL)
cv2.imshow('IMAGE', image)
k = cv2.waitKey(0)
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('IMREAD_REDUCED_GRAYSCALE_8.jpg',image)
cv2.destroyAllWindows()
二、读、写、播放视频
视频处理的基本操作步骤如下:
(1) 将视频文件或摄像头作为数据来源来创建VideoCapture对象。
(2) 调用VideoCapture对象的read()方法获取视频中的帧,每一帧都是一幅图像。
(3)调用VideoWriter对象的writer()方法将帧写入视频文件,或者调用cv2.imshow()函数在窗口中显示帧(即播放视频)。
# 从视频文件(摄像头)获取图像数据
capture = cv2.VideoCapture('vtest.avi') # 视频文件,路径为0时读取摄像头
# 获取——帧(一张照片)的宽度、高度、FPS
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
print("frame width(宽): ".format(frame_width))
print("frame height(高): ".format(frame_height))
print("frames per second(帧FPS): ".format(fps))
if capture.isOpened() is False: # 判断摄像头是否打开 capture.isOpened() --> 返回True or False
print('CAMERA ERROR !')
while capture.isOpened():
ret, frame = capture.read() # 通过摄像头,一帧一帧的捕获,返回一个布尔值(True/False),捕获每一帧(每一张照片)
if ret is True: # ret读取成功为True、读取失败为False --> 本地视频文件读取完成后关闭(brake)视频
cv2.imshow('FRAME', frame) # 显示捕获的帧
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将捕获的帧转化为灰度的帧
cv2.imshow('GRAY FRAME', gray_frame) # 显示灰度的帧
k = cv2.waitKey(100)
if k == ord('q'):
break
else:
break
capture.release()
cv2.destroyAllWindows()
# 读取彩色视频文件,保存为灰度视频文件
capture = cv2.VideoCapture('vtest.avi')
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
if capture.isOpened() is False:
print("Camera Error")
fourcc = cv2.VideoWriter_fourcc(*"XVID")
output_gray = cv2.VideoWriter('vtest_out.mp4', fourcc, int(fps), (int(frame_width),int(frame_height)), False)
while capture.isOpened():
ret, frame = capture.read()
if ret is True:
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
output_gray.write(gray_frame)
cv2.imshow('Gray',gray_frame)
k = cv2.waitKey(25)
if k == ord('s'):
break
else:
break
capture.release()
output_gray.release()
cv2.destroyAllWindows()
三、操作灰度图像
img = np.zeros((1024,1024),dtype='uint8')
n=0
while True:
cv2.imshow('gray',img)
n += 20
img[: ,:] = n # 将图像全部像素修改为 n ,n 的值在程序运行过程中不断增大
print(img[1,1])
k=cv2.waitKey(500)
if k == 27:
cv2.destroyAllWindows()
break
四、操作彩色图像
img = np.zeros((240,240,3), dtype='uint8')
r0 = 0
r1 = 1
r2 = 2
while True:
img[:80,:,r0] = 255
img[80:160,:,r1] = 255
img[160:,:,r2] = 255
cv2.imshow('color', img)
key = cv2.waitKey(1000)
img[:,:,:] = 0
t=r0
r0=r1
r1=r2
r2=t
if key == 27:
cv2.destroyAllWindows()
break
五、图像通道操作
(1) 通过数组索引拆分通道
img = cv2.imread('lena.jpg', cv2.IMREAD_REDUCED_COLOR_2)
cv2.imshow('lean', img)
b = img[: , : , 0]
g = img[: , : , 1]
r = img[: , : , 2]
cv2.imshow('B',b)
cv2.imshow('G',g)
cv2.imshow('R',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2) 使用cv2.split()函数拆分通道
img2 = cv2.imread('lena.jpg')
cv2.imshow('lean',img2)
b, g, r = cv2.split(img2)
cv2.imshow('B',b)
cv2.imshow('G',g)
cv2.imshow('R',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
(3) 合并图像通道
rgb = cv2.merge([r, g, b]) # 彩色RGB
bgr = cv2.merge([b, g, r]) # OpenCV彩色BGR
gbr = cv2.merge([g, b, r])
cv2.imshow('RGB',rgb)
cv2.imshow('BGR',bgr)
cv2.imshow('GBR',gbr)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
以上内容介绍了OpenCV-Python图像的基础操作,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。
以上是关于OpenCV-Python3.OpenCV的图像基础操作的主要内容,如果未能解决你的问题,请参考以下文章
3. OpenCV-Python——图像梯度算法边缘检测图像金字塔与轮廓检测直方图与傅里叶变换
3. OpenCV-Python——图像梯度算法边缘检测图像金字塔与轮廓检测直方图与傅里叶变换
最新Pycharm安装调用opencv-python步骤,以及遇到的问题: opencv已经安装成功;cmd环境下python可以import cv2 ;但pycharm下会出错