Opencv基础学习笔记
Opencv基础部分,以前学过,做个笔记用于复习;
当然我建议学C++版本,更齐全,Python版本的课程教学内容缺太多了;
这里只看到第35节的基础部分就结束了(因为之前只学到这)
[opencv_C++] 入门强推!!!【B站最全】_哔哩哔哩_bilibili
图像基本操作
BGR:Blue Green Red
HSV:Hue(色调) Satration(饱和度) Value(明度)
Shape:[500, 500, 3] — [h, w, RGB]

图像读取
- cv2.IMREAD_COLOR:彩色图像
- cv2.IMREAD_GRAYSCALE:灰度图像
1 | import cv2 |
图像保存
1 | import cv2 |
1 | import cv2 |
视频读取
1 | import cv2 |
截取部分图像数据
1 | import cv2 |
颜色通道提取
1 | # split,把多通道图像分为多个单通道图像 |
1 | import cv2 |
调整对比度和亮度
1 | #导入所需的库 |
绘制基本图形和文本
1 | ## 直线 |
边界填充
改变图片最外围的边框
- BORDER_REPLICATE:复制法,复制最边缘像素。
- BORDER_REFLECT:反射法,对图像中的像素进行镜像复制:fedcba|abcdefgh|hgfedcb
- BORDER_REFLECT_101:反射法,以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
- BORDER_CONSTANT:常量法,常数值填充。

图像融合
1 | import cv2 |
图像阈值与平滑处理
图像阈值
1 | # src: 输入图,只能输入单通道图像,通常来说为灰度图 |
type为如下操作
-
cv2.THRESH_BINARY 超过阈值部分取maxval,其他取0
-
cv2.THRESH_BINARY_INV 超过阈值部分取0,其他取maxval
-
cv2.THRESH_TRUNC 大于阈值部分设为阈值,其他不变
-
cv2.THRESH_TOZERO 大于阈值部分不变,其他为0
-
cv2.THRESH_TOZERO_INV 大于阈值部分为0,其他不变
常常配合createTrackbar使用
1 | # name:滑动条的名字, |
图像滤波
滤波的意义是为了让图片更加平滑,减少噪声。
中值滤波
双边滤波
双边滤波计算某一个像素点的新值时,不仅考虑距离信息(距离越远,权重越小),还考虑色彩信息(色彩差别越大,权重越小)
1 | dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType) |
1 | import cv2 |

图像形态学
腐蚀(变黑)
去除小型噪声、分离粘连物体、细化边缘
1 | import cv2 |

膨胀(变白)
连接断裂的物体部分、填充物体内部的小孔或空洞、扩大物体尺寸、去除孤立噪声点
1 | import cv2 |

开运算与闭运算
开运算:消除细小噪声与孤立点、分离粘连物体、平滑物体外轮廓
作用:医学图像中去除组织切片的小斑点、文本识别前清除文档扫描件的墨渍或断裂笔画
闭运算:填充内部空洞与缝隙、连接临近物体、平滑内轮廓
作用:工业检测中填补零件表面的微小缺陷、遥感图像中连接断裂的道路或河流
1 | import cv2 |
形态学梯度计算
边缘检测、特征提取、图像增强与锐化、光照估计与校正
目标分割:结合梯度信息与区域生长算法,实现语义分割
1 | import cv2 |
礼帽与黑帽
突出图像中的局部亮暗特征或校正光照不均匀
- 礼帽 = 原始输入 - 开运算
- 突出原图像中更亮的局域
作用:提取比周围背景更亮的细小物体、消除不均匀光照的影响,增强微弱目标特征
黑帽可以用于提取原图片里面的有特征的线/数字
- 黑帽 = 闭运算 - 原始输入
- 突出原图像中更暗的局域
作用:提取比周围更暗的区域、通过闭运算填充亮背景中的暗水印,再减去原图实现去水印
1 | import cv2 |
提取图片中水平线和垂直线
-
读取图片,转灰度图像cv_BGR2GRAY
-
转二值图像adaptiveThreshold
-
获取形状和尺寸的结构元素getStructuringElement
1 | # MODE |
-
开操作(腐蚀+膨胀)
-
bitwise,完成
图像梯度计算
图像卷积
Sobel算子
一阶微分算子,适用于噪声较多的图像,边缘较粗,适合实时性要求较高
1 | # ddepth:图像的深度 |
1 | import cv2 |
Scharr算子
laplacian算子
单独使用效果差,需配合高斯滤波(LOG算子)以抑制噪声
处理流程:
- 高斯模糊-去噪声GaussianBlur()
- 转换为灰度图像cvtColor()
- 拉普拉斯-二阶导数计算Laplacian()
- 取绝对值,显示结果convertScaleAbs()
算子对比
1 | # 几种算子对比 |
可以看出Scharr要比Sobel显示的边缘更多,而Laplacian显示的更少
边缘检测
Canny边缘检测
处理流程:
-
高斯模糊,用于平滑图像,滤除噪声
-
灰度转换
-
计算图像中每个像素点的梯度强度和方向
-
非极大值(Non-Maximum Suppression)抑制,消除边缘检测带来的杂散响应
-
应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
通过抑制孤立的弱边缘最终完成边缘检测。
- 高斯滤波器
- 计算梯度和方向
- 非极大值抑制
线性插值法:distance(g1, g2)表示两点之间的距离
设g1的梯度幅值M(g1), g2的梯度幅值M(g2)
则dtmp1可以得到:M(dtmp1) = w * M(g2) + (1 - w) * M(g1)
其中w = distance(dtmp1, g2) / distance(g1, g2)
- 双阈值检测
梯度 > maxVal,则为maxVal;梯度 < minVal,则为minVal
1 | """ |
霍夫圆
前提:边缘检测已经做完
- 把原图做一次Canny 边缘检测,得到边缘检测的二值图
- 对原始图像执行一次 Sobel 算子,计算出所有像素的邻域梯度值
- 初始化圆心空间 N(a, b),令所有的 N(a, b)=0。若要求圆心在图像中,则a,b值的范围分别对应图像的宽高,N(a,b)表示一共有a * b个
- 遍历 Canny 边缘二值图中的所有非零像素点,沿着梯度方向 (切线的垂直方向,根据Sobel 算子计算出的垂直梯度及水平梯度得来)固定搜索半径范围画线,将线段经过的所有累加器中的点 (a,b) 的 N(a,b)+=1。
- 统计排序 N(a,b),得到可能的圆心(N(a,b) 越大,越有可能是圆心)
大白话:给定一个半径R,对于所有的白色点,都i会进行半径为R的画圆;颜色越深,越令人信服。
1 | # Circles:用来存储HoughCircles的结果,类型为list,list中对象格式为x,y,r |
opencv —— HoughCircles 霍夫圆变换原理及圆检测 - 狂奔的小学生 - 博客园
opencv 十一 霍夫圆检测原理及高级使用案例(含优化步骤)-CSDN博客
像素重映射
重映射是从图像中的一个位置获取像素并将其放置在新图像中的另一位置的过程。
图像金字塔
图像金字塔是指一组图像且不同分辨率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。
实际应用中需注意:
- 金字塔层数:通常4-6层,过多会导致信息冗余。
- 结构元素:高斯核大小影响平滑效果(常用5×5)
图像增强:分层调整细节与对比度
图像融合:无缝拼接不同图像
目标检测:多尺度定位物体
图像压缩:分层存储与渐进传输
噪声抑制与光照校正
- 向下采样方法(缩小)
- 向上采样方法(放大)
1 | # pyrUp()放大图像,空白的像素点补0 |
- 拉普拉斯金字塔:lap = img2 - down
直方图与傅里叶变换
直方图
它是一种提高图像对比度的方法,拉伸图像灰度值范围
直方图的横轴表示亮度,从左到右表示亮度从低到高
直方图的纵轴表示像素数量,从下到上表示像素从少到多。
直方图在某个亮度区间的凸起越高,就表示在这个亮度区间内的像素越多
若直方图的凸起主要集中在左侧,则说明这张照片的亮度整体偏低
作用:
-
图像分析与诊断
- 亮度与对比度评估
- 曝光检测
-
图像增强
- 直方图均衡化
-
图像分割与阈值处理
- 阈值选择
- 掩膜区域分析
-
颜色分析与处理
- 通道分离统计
- 颜色校正
-
图像匹配与检索
- 相似度比较
- 特征提取
四种基本类型:
- RGB直方图
- 通道直方图
- 明度直方图
- 颜色直方图
1 | ## images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img] |
mask功能:一张图片有时候不需要统计整张图片,而是统计最中间或者做边界的一部分图片,那么就可以在参数中加入mask,原理是选中的部分为1,非选中的部分为0。
1 | # 创建mask |
直方图均衡化
直方图均衡化会使图片突出的地方更加突出,可以增加图片的特征
计算原理:新灰度值 = 旧灰度值 * 累计概率
累计概率 = 当前灰度值的概率 + 小于当前灰度值的概率
1 | # img必须是灰度图像 |
均衡化后的图片亮的地方更加亮,暗的地方更加暗,使图片的立体感更加强烈,但也有一定问题(自己搜吧)
1 | import cv2 |
直方图比较方法
- 首先把图像从RGB色彩空间转换为HSV色彩空间,cvtColor
- 计算图像的直方图,然后归一化到[0 ~ 1]之间,calcHist和normalize
- 使用下列四方法之一进行比较,compareHist
- Correlation:相关性比较
- Chi-Square:卡方比较
- Intersection:十字交叉性
- Bhattacharyya distance:巴氏距离
模板匹配
模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度
假如原图形是AxB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)
1 | import cv2 |
- TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
- TM_CCORR:计算相关性,计算出来的值越大,越相关
- TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
- TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
- TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
- TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关
1 | import cv2 |
图像轮廓
1 | # mode:轮廓检索模式 |
1 | import cv2 |
轮廓特征
1 | # 书接上回,这里可以用于计算符合面积或者周长的各种形状 |
轮廓周围绘制矩形
用最少的线来代替,在几个点之间的直线,如果能用更少的点来表示,就采用更少的点
1 | # approxPolyDP |
凸包(Convex Hull)
图像矩
OpenCV-Python快速入门(十一):图像矩_python图像的矩-CSDN博客
点多边形测试
1 | cv2.pointPolygonTest |
傅里叶变换
高频:变化剧烈的灰度分量,例如边界
低频:变化缓慢的灰度分量,例如一片大海
滤波
低通滤波器:只保留低频,会使得图像模糊
高通滤波器:只保留高频,会使得图像细节增强
1 | import cv2 |
1 | import numpy as np |
项目
本科参与的一个项目,其实不难。
描述:给定一个绿色圆形标靶,测出其与相机的角度和距离;再给电机反馈这些参数。
相机标定法,借助matlab以及相机对着棋盘进行标定,获得如下参数。
**相机内参:**焦距(fx,fy);主点坐标(cx,cy);畸变系数(径向畸变k1,k2,k3和切向畸变p1,p2)
相机内参:旋转矩阵(3x3);平移向量(3x1)
1 | import cv2 |