简介
OpenCV
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效,由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV Python
OpenCV的Python API。它结合了OpenCV C++ API和Python语言的最佳特性。
而且Numpy的支持使任务变得更加容易。 Numpy 是一个高度优化的数值运算库。它给出了一个MATLAB风格的语法。所有OpenCV数组结构都转换为Numpy数组,除此之外,还可以使用其他几个支持Numpy的库,如SciPy、Matplotlib。
因此OpenCV Python是一个适合于计算机视觉问题快速成型的工具。
安装
pip install opencv-python
官方文档:https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html
opencv简单图像处理
灰度值
把白色与黑色之间按对数关系分成若干级,称为“灰度等级”。范围一般从0到255,白色为255,黑色为0
读取图像
cv2.imread()
读取图片,返回图片对象
imread(img_path,flag)
img_path: 图片的路径,即使路径错误也不会报错,但返回的图片对象为None
flag:cv2.IMREAD_COLOR,读取彩色图片,图片透明性会被忽略,为默认参数,也可以传入1
cv2.IMREAD_GRAYSCALE,按灰度模式读取图像,也可以传入0
cv2.IMREAD_UNCHANGED,保留读取图片原有的颜色通道,也可以传入-1
代码如下:
import cv2
gray_img = cv2.imread('test.jpeg', 0) # 加载灰度图像
rgb_img = cv2.imread('test.jpeg') # 加载RGB彩色图像
一张图片的颜色是由BGR三个通道构成, 可以把一张图片上的每一个像素点看成一个对象, 这个对象又由RGB三种颜色叠加, 即用一个一维数组表示,如[111,222,111]。
假如我们有一张 5 * 6 个像素点的图片, 那么每一行有 6 个像素, 即每一行有 6 个一维数组, 即这一行是一个二维数组。
那一张图片又有 5 行, 那么我们就得到了 5 个二维数组, 这 5 个二维数组构成了一个三维数组。
(即每个最内层的数组有三个元素,代表着BGR三个通道的灰度值。第二层和第三层则负责遍历整个列和行)
显示图像
cv2.imshow()
显示图片,窗口自适应图片大小
imshow(window_name,img):
window_name: 指定窗口的名字
img:显示的图片对象
可以指定多个窗口名称,显示多个图片
cv2.waitKey()
键盘绑定事件,阻塞监听键盘按键,返回一个数字(不同按键对应的数字不同)
waitKey(millseconds)
millseconds: 传入时间毫秒数,在该时间内等待键盘事件;传入0时,会一直等待键盘事件
cv2.destroyAllWindows()
删除任何我们建立的窗口
destroyAllWindows(window_name)
window_name: 需要关闭的窗口名字,不传入时关闭所有窗口
cv2.namedWindow()
先手动创建一个窗口,再加载图像。因为有些图片过多会超过屏幕显示区域
namedWindow(window_name,flag)
window_name:窗口名称自定义
flag: cv2.WINDOW_AUTOSIZE,窗口大小随图片大小,自动变化
cv2.WINDOW_NORMAL,窗口大小可以手动调节,非常实用
代码如下:
import cv2
gray_img = cv2.imread('test.jpeg', 0) # 加载灰度图像
rgb_img = cv2.imread('test.jpeg') # 加载RGB彩色图像
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
保存图像
cv2.imwrite()
imwrite(img_path_name,img)
img_path_name:保存的文件名
img:文件对象
代码如下:
import cv2
gray_img = cv2.imread('test.jpeg', 0) # 加载灰度图像
rgb_img = cv2.imread('test.jpeg') # 加载RGB彩色图像
cv2.imwrite(r'E:/rgb_img.jpg', gray_img) # 将图像保存为jpg文件
色彩空间变换
cv2.cvtColor()
cv2.cvtColor(input_image,flag)
input_image:图像对象
flag:cv2.COLOR_BGR2GRAY,将图像从BGR空间转化成灰度图,最常用
cv2.COLOR_BGR2HSV: 表示将图像从BGR空间转换到HSV空间
使用灰度图像的原因:
图像的颜色主要是由于受到外界光照影响,我们做图像特征提取和识别过程时,要的是图像的梯度信息,也就是图像的本质内容,而颜色信息会对我们对梯度信息提取造成一定的干扰,因此在做图像特征提取和识别前须先将图像转化为灰度图。
应用:绘制灰度直方图
代码如下:
import matplotlib.pyplot as plt
import cv2
def draw_gray_hist(image_path):
"""
绘制灰度图的直方图
:param image_path:
:return:
"""
# 读取图片
image = cv2.imread(image_path)
# 图片转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
plt.hist(gray.ravel(), 256, [0, 256])
plt.show()