OpenCV(Open Source Computer Vision Library),是一个跨平台的计算机视觉库。OpenCV由英特尔公司发起并参与开发(美国公司还是强大),以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。[1][2]

OpenCV可解决增强现实、人脸识别、手势识别、人机交互、动作识别、运动追踪、物体识别、图像分割、机器人等领域问题。

注:opencv篇实验操作的图片数据集地址:deeplearning-datasets;其中绝大多数操作使用大名鼎鼎的lena阿姨照片实验;

lena

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cv2

# 读取图像
im = cv2.imread("../data/lena.jpg", 1) # 1表示3通道彩色,0表示单通道灰度
cv2.imshow("lena", im) # 在test窗口中显示图像

print(type(im)) # 打印数据类型
print(im.shape) # 打印图像尺寸

# 保存图像
cv2.imwrite("../data/lena_2.png", im)

while True:
key = cv2.waitKey() # 等待用户按键反馈
if key == 27: # ESC键
cv2.destroyAllWindows() # 销毁所有创建的窗口
break

图像色彩操作

图像色彩调整

亮度调整
  • HSV色彩空间V分量可改变图像亮度;
  • YUV色彩空间Y分量可改变图像亮度;
  • HSV和YUV都可以调整图像的亮度,但结果不太相同,原因是YUV的亮度信号Y还有两个色差信号R-Y、B-Y。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# -*- coding: utf-8 -*-
# 彩色图像亮度直方图均衡化
import cv2
from pylab import *

# 读取原始图片
raw = cv2.imread('../data/lena.jpg')

# BRG空间转换为YUV空间
yuv = cv2.cvtColor(raw, cv2.COLOR_BGR2YUV)
# 取出亮度通道,均衡化并赋回原图像
yuv[..., 0] = cv2.equalizeHist(yuv[..., 0])
# YUV空间转回BGR空间
equalized_color_yuv = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR)

# BRG空间转换为HSV空间
hsv = cv2.cvtColor(raw, cv2.COLOR_BGR2HSV)
# 取出亮度通道,均衡化并赋回原图像
hsv[..., -1] = cv2.equalizeHist(hsv[..., -1])
# HSV空间转回BGR空间
equalized_color_hsv = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

htitch= np.hstack((raw, equalized_color_yuv, equalized_color_hsv))
cv2.imshow("brightness", htitch)

while True:
key = cv2.waitKey()
if key == 27:
cv2.destroyAllWindows()
break

可观察到YUV和HSV均衡化后的照片亮度不一致,调整亮度方式选择视情况而定。
饱和度调整
  • 对HSV空间的S分量进行处理可以实现对图像饱和度的增强;
  • 饱和度的调整通常是在S原始值上乘以一个修正系数;
  • 修正系数大于1,会增加饱和度,使图像的色彩更鲜明;
  • 修正系数小于1,会减小饱和度,使图像看起来比较平淡;
色调调整
  • HSV空间的H分量进行处理可以实现对图像色调的增强;
  • 色相H的值对应的是一个角度,并且在色相环上循环,色相的修正可能会造成颜色的失真;
  • 色相的调整方式为在H原始值上加一个小的偏移量,使其在色相环上有角度的调整,调整后,图像的色调会变为冷色或者暖色;

图像灰度化

在RGB模型中,如果R=G=B时,则表示一种灰度颜色,其值叫灰度值;灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为[0, 255]。

图像灰度化处理方法

RGB图像转换为灰度图像的过程称为图像灰度化处理,方法有:

  • 分量法:将彩色图像中的三分量中的亮度作为灰度值,根据需要选取其中一分量;
  • 最大值法:将彩色图像中的三分量中亮度的最大值作为灰度图的灰度值;
  • 平均值法:将彩色图像中的三分量亮度求平均得到一个灰度值;
  • 加权平均法:根据重要性及其它指标,将三个分量以不同的权值进行加权平均,如:人眼对绿色的敏感最高,对蓝色敏感最低,对RGB三分量进行加权平均能得到较合理的灰度图像。
    $f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j)$

图像二值化与反二值化

二值化
  • 灰度值大于阈值的像素点,灰度值设为最大值255;
  • 灰度值小于或等于阈值的像素点,灰度值设为0;
反二值化

与二值化相反:

  • 灰度值大于阈值的像素点,灰度值设为最大值0;
  • 灰度值小于或等于阈值的像素点,灰度值设为255;

图像直方图均衡化

图像直方图

灰度直方图反映的是一幅图像中各灰度级像素出现的频率,即灰度的分布情况。灰度级为横坐标,灰度级的频率为纵坐标,灰度级与灰度级频率的关系图为灰度直方图。

改变图像的灰度直方图,修改图像中各像素的灰度值,可达到增强图像视觉效果的目的。灰度变化只针对单独的像素点操作,直方图变化综合考虑了全图的灰度值分布。

图像直方图均衡化

直方图均衡化将原始图像的直方图,即灰度概率分布图,进行调整,使之变化为均衡分布的样式,达到灰度级均衡的效果,可以有效增强图像的整体对比度。

直方图均衡化能够自动的计算变化函数,通过该方法自适应得产生有均衡直方图的输出图像,能够对图像过暗、过亮和细节不清晰的图像得到有效的增强。

图像形态操作

仿射与透视变换

仿射变换是指图像可以通过一系列的几何变换来实现平移镜像旋转等多种操作。

仿射变换
  1. 平移
  1. 镜像
  1. 旋转
透视变换

透视变换是将图片投影到一个新的视平面,也称作投影映射。它是二维$(x,y)$到三维$(x,y,z)$,再到另一个二维$(x’,y’)$空间的映射;相比仿射变换,其具灵活性更强,透视变换可用于图像形状校正;

图像算数计算

图像加法
  • 图像加法可以用于多幅图像平均去除噪声;
  • 图像加法实现水印的叠加;
图像减法
  • 图像减法是找出两幅图像的差异,可在连续图像中可以实现背景消除和运动检测;

图像缩放

图像缩放(Image Scaling)是指对数字图像的大小进行调整的过程。将分辨率为$(w,h)$的图像,缩放为$(w’, h’)$的图像。

图像放大

图像放大需要进行像素插入,常用的插值法有最邻近插值法双线性插值法

  • 最邻近插值法:直接使用新的像素点$(x’, y’)$最近的整数坐标灰度值作为该点的值,该方法计算量小,但精确度不高,并且可能破坏图像中的线性关系;
  • 双线性插值法:使用新的像素点$(x’, y’)$最邻近的四个像素值进行插值计算,假设为$(i, j),(i+1, j),(i, j+1),(i+1, j+1)$;则$u=x’-i, v=y’-j$。
图像缩小

图像缩小通过删除矩阵中的元素来实现,如:隔行、隔列删除,高度、宽度均减小为原来的一半。

图像腐蚀与膨胀

图像腐蚀

图像腐蚀可将图像的边界点消除,使图像沿着边界向内收缩,也可将小于指定结构体元素的部分去除。腐蚀用来“收缩”或“细化”二值图像中的前景,借此实现去除噪声、元素分割等功能。

图像膨胀

图像膨胀可根据原图像的形状,向外进行扩充,膨胀操作可填补图像分割后存在的空白。

图像开运算

开运算是先将图像腐蚀,再进行膨胀。

  • 开运算可去噪、计数等;
  • 开运算可取出主题图像之间细小的连接;
图像闭运算

闭运算是先将图像膨胀、再进行腐蚀。

  • 可关闭前景物体内部的小孔,去除物体上的小黑点;
  • 可将不同的前景图像进行连接;
图像形态学梯度

形态学梯度运算是用图像的膨胀图像减腐蚀图像的操作,该操作可以获取原始图像中前景图像的边缘。

图像礼帽运算

图像礼帽运算是用原始图像减去开运算图像的操作。礼帽运算能够获取图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息。

图像黑帽运算

图像黑帽运算是用闭运算图像减去原始图像的操作。黑帽运算能够获取图像内部的小孔, 或前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分.

图像梯度处理

图像梯度

图像梯度计算的是图像变化的速度,一般用于图像的边缘信息计算。

  • 对于图像的边缘部分,其灰度值变化较大,梯度值也较大;
  • 对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小;

图像模块运算

模板(滤波器)是一个尺寸为$n*n$的小图像W(n一般取奇数,称为模板尺寸),每个位置上的值w被称为权重。在进行计算时,将模板的中心和像素P对齐,选取原始图像中和模板相同范围的邻域N的像素值作为输入。

模板卷积的计算是将对齐后的对应位置像素相乘,再进行累加作为像素P位置的输出值。记原始图像的像素灰度值为s,计算后的值为d,则P点的输出值:$d=\frac{\sum w_{i}s_{i}}{\sum w_{i}}$

模板排序的计算是将邻域N的像素值进行排序,选择特定次序的灰度值,作为像素P位置的输出值,如最大值、最小值、中位数等。

图像均值滤波

均值滤波指模板权重都为1的滤波器。它将像素的邻域平均值作为输出结果,均值滤波可以起到图像平滑的效果,可以去除噪声,但随着模板尺寸的增加图像会变得更为模糊,经常被作为模糊化使用。

图像高斯滤波

为了减少模板尺寸增加对图像的模糊化,可以使用高斯滤波器,高斯滤波的模板根据高斯分布来确定模板系数,接近中心的权重比边缘的大。

图像中值滤波

中值滤波属于模板排序运算的滤波器。中值滤波器将邻域内像素排序后的中位数值输出代替原像素值。它在实现降噪操作的同时,保留了原始图像的锐度,不会修改原始图像的灰度值。

中值滤波的使用非常普遍,它对椒盐噪声的抑制效果很好,在抑制随机噪声的同时能有效保护边缘少受模糊。但中值滤波是一种非线性变化,它可能会破坏图像中线性关系,对于点、线等细节较多的图像和高精度的图像处理任务中并不太合适。

图像边缘检测

通过梯度计算可以获取图像中细节的边缘。为在锐化边缘的同时减少噪声的影响,通过改进梯度法发展出了不同的边缘检测算子:

  • 一阶梯度:Prewitt梯度算子、Sobel梯度算子;
  • 二阶梯度:Laplacian梯度算子;

图像锐化

图像锐化与图像平滑是相反的操作,锐化是通过增强高频分量来减少图像中的模糊,增强图像细节边缘和轮廓,增强灰度反差,便于后期对目标的识别和处理。锐化处理在增强图像边缘的同时也增加了图像的噪声。将求取的边缘按照一定系数比例叠加到原始图像上,即可实现对图像的锐化操作。

图像轮廓处理

图像轮廓

边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。 图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。图像轮廓是图像中非常重要的一个特征信息,通过对图像轮廓的操作,能够获取目标图像的大小、位置、方向等信息。图像轮廓操作包括:查找轮廓、绘制轮廓、轮廓拟合等。

图像轮廓查找与绘制

一个轮廓对应着一系列的点,这些点以某种方式表示图像中的一条曲线,将这些点 绘制成不同样式的线条,就是轮廓查找与绘制

图像轮廓拟合

在计算轮廓时,可能并不需要实际的轮廓,而仅需要一个接近于轮廓的近似多边形,绘制这个近似多边形称之为轮廓拟合。

图像最小包围圆形与矩形包围形

图像最优拟合椭圆

图像多边形逼近

图像预处理AI应用

解决AI训练数据时图像样本不足问题,主要对图像进行图像数据增强

  • 缩放
  • 裁剪
  • 旋转
  • 镜像
  • 平移
  • 加入噪点
  • 颜色饱和度改变
  • 对比度调整
  • 通道变化