OpenCV 是一个非常好用的计算机视觉库,广泛应用于图像处理、视频分析、目标检测等领域。本文将通过简单易懂的代码,入门 OpenCV 的基础操作,包括图像的读取、显示、保存、灰度转换、裁剪以及通道处理。
一、环境配置
在开始之前,需要先安装 OpenCV 库
python
pip install opencv
安装完成后,在 Python 代码中导入库即可使用:
python
import cv2
import numpy as np
二、图像基础操作
想要处理图像,我们首先要学会读取和显示图像
2.1. 图像的读取与显示
python
import cv2
import numpy as np
a = cv2.imread('pic01.png')
cv2.imshow('tu',a)
cv2.waitKey(0)
cv2.destroyAllWindows()
print('图像形状:', a.shape)
print('图像数据类型:', a.dtype)
print('图像大小:', a.size)
其中
cv2.imread('需要读取的图片路径')
cv2.imshow('展示窗口名称',读取的图片)
cv2.waitKey(0)表示等待按键输入(0表示无限等待,直到按下任意键)
cv2.destroyAllWindows()表示关闭所有显示窗口

2.2. 灰度图转换与保存
对于那些各种花里胡哨的图片,如何让计算机高效的识别图片是一个非常重要的问题,其中灰度图因其单通道图像,数据量更小,成为了很多图像处理的基础预处理步骤:
python
import cv2
import numpy as np
b = cv2.imread('pic01.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('xx', b)
cv2.waitKey(0)
cv2.destroyAllWindows()
print('图像形状:', b.shape)
print('图像数据类型:', b.dtype)
print('图像大小:', b.size)
cv2.imwrite('pic01_GRAY.png', b)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imread('需要读取的图片路径',cv2.IMREAD_GRAYSCALE)这里我们之间在之前读取图片的基础上,加上cv2.IMREAD_GRAYSCALE,就可以读取灰度图片了。
那么如果我们需要保存修改后的文件,直接用cv2.imwrite就可以了

2.3. 图像裁剪
OpenCV 图像本质是 NumPy 数组,通过数组切片即可实现图像裁剪:
python
import cv2
import numpy as np
a = cv2.imread('pic01.png')
b = a[30:230,100:300]
cv2.imshow('yuantu',a)
cv2.imshow('qiepian',b)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:裁剪区域的尺寸必须与原图像匹配,否则会报错。
2.4. 通道分离与合并
OpenCV 彩色图为BGR 顺序(蓝 - 绿 - 红),不同于我们常说的红绿蓝,我们通常就是说成BGR。我们可以将蓝 - 绿 - 红单独对通道进行分离、修改和合并。
python
import cv2
a = cv2.imread('pic01.png')
a1 = a[:, :, 0]
a2 = a[:, :, 1]
a3 = a[:, :, 2]
b,g,r = cv2.split(a)
cv2.imshow('b',b)
cv2.imshow('g',g)
cv2.imshow('r',r)
a = cv2.imread('pic01.png')
a_new = a.copy()
a_new[:, :, 1] = 0
a_new[:, :, 2] = 0
cv2.imshow('result2', a_new)
img = cv2.merge((b,g,r))
cv2.imshow('result3',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

如下图是仅保留蓝色通道(将G、R通道置0),当然我们除了分离各个bgr通道,我们还可以将分离的通道合并img_merge = cv2.merge((b, g, r))将各分离的通道还原为原图。

三、像素赋值、图像拼接与缩放
学会了基础操作,我们来更高级的操作,实现像素级操作和图像几何变换,这是实现马赛克、图像合成、尺寸调整的核心。
python
import numpy as np
import cv2
a = cv2.imread('pic01.png')
xxx=np.random.randint(0,256,(3,3))
print(xxx)
a[100:200,200:300] = np.random.randint(0,256,(100,100,3))#矩阵赋值必须是相同大小
cv2.imshow('masaike',a)
cv2.waitKey(0)
cv2.destroyAllWindows()
a = cv2.imread('pic01.png')
b = cv2.imread('bizhi.jpg')
b[200:350,200:350] = a[50:200,100:250]
cv2.imshow('b',b)
cv2.imshow('a',a)
cv2.waitKey(0)
cv2.destroyAllWindows()
a = cv2.imread('pic01.png')
a_new = cv2.resize(a, dsize=(200,200))
cv2.imshow('a',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.1实现马赛克效果

np.random.randint(0,256,(3,3)):生成一个 3 行 3 列的二维数组,元素值在 0-255 之间。
a[100:200,200:300]:选取图像a中「y 轴 100-200 行、x 轴 200-300 列」的区域,该区域尺寸为 100行 × 100列 × 3通道。
np.random.randint(0,256,(100,100,3)):生成与目标区域尺寸完全匹配的随机像素矩阵(100×100×3),赋值后该区域像素变为随机值,形成马赛克效果。

3.2. 图像拼接

b[200:350,200:350]:y 轴 200-350 行(共 150 行),x 轴 200-350 列(共 150 列),尺寸为 150×150×3。
a[50:200,100:250]:y 轴 50-200 行(共 150 行),x 轴 100-250 列(共 150 列),尺寸为 150×150×3。
将图像a的局部区域,直接覆盖粘贴到图像b的指定位置,实现简单的图像合成。

3.3. 图像缩放

cv2.resize(img,dsize=(宽度, 高度))修改图像的尺寸。
cv2.resize默认使用双线性插值(INTER_LINEAR),可通过interpolation参数修改。

四、视频基础操作
python
import cv2
video_capture = cv2.VideoCapture('test.avi')
if not video_capture.isOpened():
print('cannot open video')
exit(0)
while True:
ret, frame = video_capture.read()
if not ret:
break
frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow("Video",frame)
if cv2.waitKey(60) == 27:
break
video_capture.release()
cv2.destroyAllWindows()
cv2.VideoCapture():用于打开视频文件或摄像头。
cap.read():返回(是否读取成功, 当前帧图像),视频结束时ret=False。
cv2.waitKey(30):控制播放速度,30ms / 帧约等于 33 帧 / 秒,接近常见视频帧率。

以上就是opencv的基础操作了。