【OpenCV-Python】3.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通道

# 注意,除了这三个标志,也可以分别传递整数10-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-Python,opencv,python,计算机视觉)