type
Post
status
Published
date
Feb 24, 2025
slug
OpenCV3
summary
03OpenCV图像处理,包含 几何变换、形态学操作、图像平滑、直方图、边缘检测、模板匹配 和 霍夫变换
tags
Python
计算机视觉
category
计算机视觉
icon
password
参考课程:
【黑马程序员 OpenCV入门教程】
@ZZHow(ZZHow1024)
1.1几何变换
- 图像缩放
- 对图像的大小进行调整,即使图像放大或缩小
- 参数
- src:输入图像
- dsize:绝对尺寸,直接指定调整后图像的大小
- fx, fy:相对尺寸,将 dsize 设置为 None,然后将 fx 和 fy 设置为比例因子即可
- interpolation:插值方法
插值 | 含义 |
cv2.INTER_LINEAR | 双线性插值法 |
cv2.INTER_NEAREST | 量近邻插值 |
cv2.INTER_AREA | 像素区域重采样(默认) |
cv2.INTER_CUBIC | 双三次插值 |
- 图像平移
- 将图像按照指定方向和距离,移动到相应的位置
- 参数
- image:输入图像
- M:2 × 3 移动矩阵
- 对于 处的像素点,要把它移动到 处时, 矩阵应如下设置
- 注意:将 设置为
np.float32类型的 NumPy 数组 - dsize:输出图像的大小
- 注意:输出图像的大小应该是 (宽度, 高度) 的形式,width=列数,height=行数
- 图像旋转
- 将图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸
- 假设图像逆时针旋转 ,则根据坐标转换可得旋转转换为
- 参数
- center:旋转中心
- angle:旋转角度
- scale:缩放比例
- 返回
M:旋转矩阵,调用
cv.warpAffine()完成图像的旋转
其中
代入公式有
也可以写成
原点修正
- 仿射变换
- 图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合
- 在OpenCV中,仿射变换的矩阵是一个 2 × 3 的矩阵
- 其中左边的 2 × 2 子矩阵 是线性变换矩阵,右边的 2 × 1 子矩阵 是平移项
- 对于图像上的任一位置 ,仿射变换执行的是如下的操作
- 注意:对于图像而言,宽度方向是 x,高度方向是 y,坐标的顺序和图像像素对应下标一致,原点的位置不是左下角而是右上角,y 的方向也不是向上,而是向下
- 在 OpenCV 中
cv2.getAffineTransform会创建一个 2 × 3 的矩阵,最后这个矩阵会被传给函数cv2.warpAffine
- 透射变换
- 透射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换
- 它的本质将图像投影到一个新的视平面,其通用变换公式为
- 在 OpenCV 中,我们要找到四个点,其中任意三个不共线,然后获取变换矩阵 ,再进行透射变换
- 通过函数
cv2.getPerspectiveTransform找到变换矩阵,将cv2.warpPerspective应用于此 3 × 3 变换矩阵
其中, 是原始的图像像素坐标, 取值为 1, 是透射变换后的结果
后面的矩阵称为透视变换矩阵,一般情况下,我们将其分为三部分
其中, 表示对图像进行线性变换, 对图像进行平移, 表示对图像进行投射变换, 一般设为 1
- 图像金字塔
- 图像多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构
- 金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低
1.2形态学操作
- 连通性
- 在图像中,最小的单位是像素,每个像素周围有 8 个邻接像素,常见的邻接关系有 3 种
- 4 邻接:像素 的 4 邻域是:,用 表示像素 的 4 邻接
- 8 邻接:像素 的 8 邻域是:4 邻域的点 + D 邻域的点,用 表示像素 p 的 8 邻域
- D 邻接:像素 的 D 邻域是:,用 表示像素 的 邻接
- 连通性是描述区域和边界的重要概念,两个像素连通的两个必要条件是
- 两个像素的位置是否相邻
- 两个像素的灰度值是否满足特定的相似性准则
- 根据连通性的定义,有 4 联通、8 联通和 联通三种
- 4 连通:对于具有值 的像素 和 ,如果 在集合 中,则称这两个像素是 4 连通
- 8 连通:对于具有值 的像素 和 ,如果 在集合 中,则称这两个像素是 8 连通
- 连通:对于具有值 的像素 和 ,如果 在集合 中或 在集合 中,并且 与 的交集为空(没有值 的像素),则称这两个像素是 连通的,即 4 连通和 连通的混合连通
- 腐蚀和膨胀
- 腐蚀:时原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域,是求局部最小值的操作
- 膨胀:使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域,是求局部最大值的操作
- 腐蚀
- 用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为 1,则该像素为 1,否则为 0
- 参数
- 膨胀
- 用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为 0,则该像素为 0,否则为 1
- 参数
- 开闭运算
- 开运算
- 开运算是先腐蚀后膨胀
- 作用:分离物体,消除小区域
- 特点:消除噪点,去除小的干扰块,而不影响原来的图像
- 闭运算
- 与开运算相反,是先膨胀后腐蚀
- 作用:是消除/闭合物体里面的孔洞
- 特点:可以填充闭合区域
- 参数
- img:要处理的图像
- op:处理方式,开运算
cv.MORPH_OPEN,闭运算cv.MORPH_CLOSE - kernel:核结构
- 礼帽和黑帽
- 礼帽运算
- 原图像与 “开运算“ 的结果图之差
- 数学表达式:
- 作用:
- 黑帽运算
- ”闭运算“ 的结果图与原图像之差
- 数学表达式:
- 作用:用来分离比邻近点暗一些的斑块
- 参数
- image:要处理的图像
- op:处理方式
- kernel:核结构
1.3图像平滑
- 图像噪声
- 椒盐噪声(脉冲噪声)
- 是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)
- 成因:影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等
- 高斯噪声(正态噪声)
- 是指噪声密度函数服从高斯分布的一类噪声
- 高斯随机变量 的概率密度函数:
- 滤波器
- 均值滤波
- 采用均值滤波模板对图像噪声进行滤除
- 令 表示中心在 点,尺寸为 的矩形子图像窗口的坐标 组
- 数学表达式:
- 优点:算法简单,计算速度较快
- 缺点:去噪的同时去除了很多细节部分,将图像变得模糊
- 参数
- 高斯滤波
- 二维高斯是构建高斯滤波器的基础
- 概率分布函数:
- 高斯平滑在从图像中去除高斯噪声方面非常有效
- 高斯平滑的流程
- 参数
- 中值滤波
- 中值滤波是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值
- 中值滤波对椒盐噪声来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的值
- 参数
1.4直方图
- 灰度直方图
- 原理
- 直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中
- 注意:直方图是根据灰度图进行绘制的,而不是彩色图像
- 直方图的一些术语和细节:
- 直方图的意义:
- 直方图的计算和绘制
- 使用 OpenCV 中的方法统计直方图,并使用 matplotlib 将其绘制出来
- image:原图像,当传入函数时应该用中括号口括起来
- channel:通道
- mask:掩模图像
- histSize:bin 的数目
- range:像素值范围,通常为 [0, 256]
- 掩膜的应用
- 掩膜是用选定的图像、图形或物体,对要处理的图像进行挡,来控制图像处理的区域
- 用途
- 提取感兴趣区域
- 屏蔽作用
- 结构特征提取
- 特殊形状图像制作
- 直方图均衡化
- 原理:把原始图像的灰度直方图从比较集中的某个灰度区间变成在更广泛灰度范围内的分布
- 应用:扩大图像像素值的分布范围,提高图像的对比度
- 参数
- 自适应的直方图均衡化
- 对整个图像进行直方图均衡化效果并不好
- 自适应的直方图均衡化:整幅图像被分成很多小块,这些小块被称为 tiles(在 OpenCV 中 tiles 的大小默认是 8 × 8),然后再对每一个小块分别进行直方图均衡化,最后为了去除每一个小块之间的边界,再使用双线性差值对每一小块进行拼接
- createCLAHE 参数
- apply 参数
- 案例演示:histogram.ipynb
1.5边缘检测
- 概述
- 目的:标识数字图像中亮度变化明显的点
- 作用:大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性
- 边缘检测方法
- Sobel 算子
- Sobel 边缘检测算法比较简单,实际应用中效率比 Canny 效率更高,但是边缘不如Canny 检测的准确
- 注意:当内核大小为 3 时,Sobel 内核可能产生比较明显的误差,为解决这一问题,我们使用 Scharr 函数,但该函数仅作用于大小为 3 的内核
- Scharr 函数该函数的运算与 Sobel 函数一样快,但结果却更加精确
- 参数
- Laplacian 算子
- Laplacian 是利用二阶导数来检测边缘
- 参数
- Canny 边缘检测
- Canny 边缘检测算法是一种非常流行的边缘检测算法,是 John F. Canny 于 1986 年提出的,被认为是最优的边缘检测算法
- 原理
- 参数
- 案例演示:edge_detection.ipynb
1.6模板匹配
- 在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果
- 参数
- img:要进行模板匹配的图像
- template:模板
- method:实现模板匹配的算法
- 完成匹配
- 使用
cv.minMaxLoc方法查找最大值所在的位置即可 - 如果使用平方差作为比较方法,则最小值位置是最佳匹配位置
1.7霍夫变换
- 霍夫变换常用来提取图像中的直线和圆等几何形状
- 霍夫线检测
- 参数
- 霍夫圆检测
- OpenCV 中使用霍夫梯度法进行圆形的检测
- 霍夫梯度法将霍夫圆检测范围两个阶段
- 参数
03OpenCV图像处理