简介

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()