openCV 学习

openCV 学习
Abei介绍:用于记录自己学习 openCV 的理论笔记
openCV笔记
图像读取
1 | import cv2 |
视频读取
1 | import cv2 |
截取部分图像数据
1 | # -------------------------截取部分图像数据---------------------------------- |
颜色通道提取
1 | import cv2 |
边界填充
如果实际的图像与需求大小不符,可以将图像边缘进行填充
1 | import cv2 |
图像融合
1 | import cv2 |
图像阈值
1 | # ret,dst = cv2.threshold(src,thresh,maxval,type) |
图像平滑处理
1 | import cv2 |
形态学-腐蚀操作和膨胀操作
去除以下图片的毛刺
1 | # -------------------------腐蚀操作---------------------------------- |
开运算与闭运算
开运算: 先腐蚀再膨胀
闭运算:先膨胀再腐蚀
1 | # 开运算 |
梯度运算
1 | # 梯度 = 膨胀 - 腐蚀 |
礼帽与黑帽
- 礼帽 = 原始输入 - 开运算结果
- 黑帽 = 闭运算 - 原始输入
1 | # 礼帽 |
图像梯度 - Sobel算子
Gx 表示水平方向,Gy 表示垂直方向
1 | img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE) |
图像梯度 - Scharr算子
图像梯度 - laplacian算子
1 | img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE) |
Canny 边缘检测算法
- 使用高斯滤波器,以平滑图像, 滤除噪声。
- 计算图像中每个像素点的梯度强度和方向。
- 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
- 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
- 通过抑制孤立的弱边缘最终完成边缘检测。
高斯滤波器
梯度和方向
非极大值抑制
双阈值检测
1 | img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE) |
图像金字塔
高斯金字塔
向下采样方法(缩小)
向上采样方法(放大)
1 | img = cv2.imread("AM.png") |
拉普拉斯金字塔
1 | down = cv2.pyrDown(img) |
图像轮廓
cv2.findContours(img,mode,method)
mode:轮廓检索模式
- RETR_EXTERNAL:只检索最外面的轮廓
- RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中
- RETR_CCOMP:检索所有的轮廓,并将他们组织为两层,顶层是各部分的外部边界,第二层是空洞的边界
- RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次(==用这个就足够==)
method:轮廓逼近方法
- CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
- CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
1 | img = cv2.imread("contours.png") # 必须为 png 格式 |
轮廓近似
设置阈值 T,找出与 AB 曲线上最远的点 D,判断 D 到 AB 的距离是否小于阈值,若小于则将 AB 直线代替 AB 曲线,若大于,则继续以相同的方法判断 AD 直线能否代替 AD 曲线,以此类推。
1 | img = cv2.imread('contour2.png') |
边界矩形
画出轮廓的外接矩形
1 | img = cv2.imread('contour2.png') |
外接圆
1 | # 承接了上一小节的 cnt |
一个三角形画出了外接矩形和外接圆
模板匹配
模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度的计算方法在 opencv 里有 6 种,然后将每次计算的结果放入一个矩阵,作为结果输出。假如原图形是 A * B 大小, 而模板是 a * b 大小,则输出结果的矩阵是(A - a + 1)*(B - b + 1)
- TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
- TM_CCORR:计算相关性,计算出来的值越大,越相关
- TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
- TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
- TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
- TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关
1 | img = cv2.imread('lena.jpg', 0) |
直方图
cv2.calcHist(images, channels, mask, histSize, ranges)
- images:原图像图像格式为 uint8 或 float32。当传入函数时,用中括号 [] 括,例如 [img]
- channels:同样用中括号括来他会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0] 如果是彩色图像的传入参数可以是 [0] [1] [2] 他们分别对应着 BGR
- mask:掩模图像。统整幅图像的直方图就把它为 None。但是如果想统图像某一部分的直方图,就制作一个掩模图像并使用它。
- histSize:BIN 的数目。也应用中括号括来
- ranges:像素值范围常为 [0256]
1 | img = cv2.imread('cat.jpg', 0) # 表示灰度图 |
mask 操作
1 | # 创建mask |
直方图均衡化
1 | # 传入一个图像即可 |
结果:
自适应直方图均衡化
将图像分块,只在各自块内进行直方图均衡化处理
1 | clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) |
傅里叶变换
点击去知乎看详解 ->>> 傅里叶分析之掐死教程(完整版)
傅里叶变换的作用
- 高频:变化剧烈的灰度分量,例如边界。
- 低频:变化缓慢的灰度分量,例如一片大海。
滤波:
低通滤波器:只保留低频,会使得图像模糊
高通滤波器:只保留高频,会使得图像细节增强
opencv中主要就是 cv2.dft() 和 cv2.idft(),输入图像需要先转换成np.float32 格式
得到的结果中频率为 0 的部分会在左上角,通常要转换到中心位置,可以通过 shift 变换来实现。
cv2.dft() 返回的结果是双通道的(实部,虚数),通常还需要转换成图像格式才能展示(0,255)
1 | import numpy as np |
低通滤波
1 | import numpy as np |
高通滤波
1 | import numpy as np |