文章目录
OpenCV
是一个跨平台的计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。
1. OpenCV 主要模块
![](https://i-blog.csdnimg.cn/blog_migrate/117a0f7685db18fd3dba9b29f9211785.png)
2. OpenCV 图像处理基础
2.1 图像处理一般流程
图像处理的一般流程如下:
- 读取图像:图像的获取来源众多(相机、视频流、磁盘、在线资源等),因此图像的读取可能涉及多个函数(从不同的来源读取图像);
- 图像处理:使用图像处理技术处理图像,以实现所需功能;
- 低层处理(预处理):输入一张图像,然后使用噪声消除、图像锐化、光照归一化以及透视校正等方法进行处理,最后输出另一张图像;
- 中层处理:提取预处理后图像的主要特征,输出某种形式的图像表示(提取了用于图像进一步处理的主要特征);
- 高层处理:接受中层处理后的图像特征并输出最终结果。例如,处理的输出可以是检测到的人脸。
- 显示结果:将图像处理完成后的结果以人类可读的方式进行呈现。
2.2 颜色通道顺序
由于历史原因,在 OpenCV 中使用的颜色通道顺序为 BGR 格式非 RGB 格式。但是,有一些 Python 包使用的却是 RGB 颜色格式(如 Matplotlib 使用 RGB 颜色格式),因此,我们需要掌握图像在不同格式间的转换。
img_opencv = cv2.imread('sigonghuiye.jpeg') # 以 BGR 顺序加载图像
b, g, r = cv2.split(img_OpenCV) # 将加载的图像分成 (b, g, r) 三个通道
img_matlab = cv2.merge([r, g, b]) # 遵循 RGB 格式合并通道( Matlab 格式)
分别使用 OpenCV 和 Matplotlib 绘制结果以供对比:
(1)使用OpenCV
绘制两张图像
img_opencv = cv2.imread('girl.jpg') # BGR 格式
b, g, r = cv2.split(img_opencv) # 分割通道
img_matlab = cv2.merge([r, g, b]) # 以 RGB 格式合并通道
img_concate = np.concatenate((img_opencv, img_matlab), 1) # 同一个窗口中显示两张图像
cv2.imshow('Images', img_concate)
cv2.waitKey()
cv2.destroyAllWindows()
![](https://i-blog.csdnimg.cn/blog_migrate/591c16eefe162fcc87e9926777440a3a.png)
(2)使用Matplotlib
绘制两张图像
plt.subplot(121)
plt.imshow(img_opencv)
plt.subplot(122)
plt.imshow(img_matlab)
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/807178d0cce41a21e8751b98d26bbd9d.png)
2.3 基于 Numpy 的通道便捷处理
cv2.split()
划分通道是一项耗时的操作。在实际中,应优先考虑使用 Numpy 索引。如果想获取图像的一个通道,可通过如下方式获取:
B = img_opencv[:, :, 0] # (高,宽,通道数)
G = img_opencv[:, :, 1]
R = img_opencv[:, :, 2]
此外,可使用一条 Numpy 语句将图像从 BGR 转换为 RGB:
img_matlab= img_opencv[:, :, ::-1] # -1表示翻转读取
2.4 OpenCV 对像素的访问及操作
2.4.1 彩色图像
- 访问(读取)某个像素值:
(b, g, r) = img_opencv[6, 40]
- 访问一个通道:
b = img_opencv[6, 40, 0] # 获取像素(x=40,y=6)处的蓝色值
- 更改像素值:
img_opencv[6, 40] = (0, 0, 255) # 将像素(x=40, y=6)设置为红色
- 处理某个区域而非单个像素:
crop = img_opencv[0:50, 0:50] # 即切片操作
2.4.2 灰度图像
灰度图像只有一个通道,因此与彩色图像的处理稍有差异。
cv2.imread()
函数:读取图像,需要指定读取图像的方式(以灰度加载图像所需的参数为cv2.IMREAD_GRAYSCALE
):
gray_img = cv2.imread('girl.jpg', cv2.IMREAD_GRAYSCALE)
- 灰度图像的尺寸为(height, width),不提供通道信息。