cv2
传统cv基础以及opencv-python常用api记录
参考资料
OpenCV-Python图形图像处理专栏文章目录_老猿Python-CSDN博客
opencv学习笔记十:使用cv2.morphologyEx()实现开运算,闭运算,礼帽与黑帽操作以及梯度运算_耐心的小黑的博客-CSDN博客
Note
在单色图中,intensity 是 强度 gray scale 是灰度。而强度一般由 光源的能量和物体反射能量的比例的乘积 决定。 也就是如果能量越小,颜色就越暗,极限就是能量为0,所以黑色是0;而能量很大,就很亮,也就是白色,所以白色是255.
获取kernel
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
- 第一个参数
shape指明形状cv2.MORPH_ELLIPSE->椭圆cv2.MORPH_CROSS->十字型cv2.MORPH_RECT->矩形
- 第二个参数指明大小
- 可以使用
numpy数组当kernel
膨胀/腐蚀
OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍_老猿Python-CSDN博客_opencv腐蚀膨胀函数
cv2.dilate(img, kernel)
cv2.erode(img, kernel)
- 膨胀
dilate- 卷积核内取最大
- 腐蚀
erode- 卷积核内取最小
cv2中边界值补全处理的是左边和上边
开闭运算
OpenCV-Python教程(4、形态学处理)_sunny2038的专栏-CSDN博客
将腐蚀和膨胀按一定次序处理
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
- 闭运算:用来连接被误分为许多小块的对象
- 连接
- 开运算:开运算用于移除由图像噪音形成的斑点
- 擦除
- 典型用例
- 对一副二值图连续使用闭运算和开运算,将获得图像中的主要对象
- 想消除图像中的噪声(即图像中的“小点”),也可以对图像先用开运算后用闭运算,不过这样也会消除一些破碎的对象
二值化
opencv二值化的cv2.threshold函数 - 音量 - 博客园 (cnblogs.com)
cv2.threshold(img, thresh, maxval, type)
- 根据type不同具体效果不同

图片基本操作
OpenCV Python教程(1、图像的载入、显示和保存)_sunny2038的专栏-CSDN博客
读取并显示
import cv2
img = cv2.imread("D:\\cat.jpg") #读取图片,img类型为numpy.ndarray, dtype=uint8
cv2.namedWindow("Image") #创建窗口并赋予名字,名字相当于id
cv2.imshow("Image", img) #在窗口上显示图片,名字要对应,否则无法显示
cv2.waitKey (0) #等待按键,不添加会马上结束(闪退)
cv2.destroyAllWindows() #释放窗口
复制/转换
img_copy = img.copy()
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转换为灰度图片
保存
cv2.imwrite("yourpath", img)
- 第三个可选参数决定压缩率,具体见文档
通道分离/合并
b, g, r = cv2.split(img) #分离bgr通道
img_ = cv2.merge([b, g, r]) #合并通道
Canny边缘检测
OpenCV-Python教程(8、Canny边缘检测)_sunny2038的专栏-CSDN博客
API: 输入灰度图,输出二值化的边缘图,参数为两个阈值,具体作用见Canny edge detector - Wikipedia
edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
使用示例:
使用前一般搭配高斯blur去噪
import cv2
import numpy as np
img = cv2.imread("D:/lion.jpg", 0)
img = cv2.GaussianBlur(img,(3,3),0)
canny = cv2.Canny(img, 50, 150)
cv2.imshow('Canny', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
Blur
OpenCV-Python教程(5、初级滤波内容)_sunny2038的专栏-CSDN博客
过滤可以移除图像中的噪音、提取感兴趣的可视特征、允许图像重采样,等等。
低通滤波
低通滤波器的目标是降低图像的变化率,如将每个像素替换为该像素周围像素的均值。这样就可以平滑并替代那些强度变化明显的区域
API
dst = cv2.blur(image,(5,5)) #均值滤波
高斯blur
在某些情况下,需要对一个像素的周围的像素给予更多的重视。因此,可通过分配权重来重新计算这些周围点的值。这可通过高斯函数(钟形函数,即喇叭形数)的权重方案来解决。
高斯模糊原理(Gaussian Blur)_飘云之下的博客-CSDN博客_高斯模糊
各个方法对比
OpenCV高斯滤波GaussianBlur_godadream的博客-CSDN博客_gaussianblur
| 滤波器种类 | 基本原理 | 特点 |
|---|---|---|
| 均值滤波 | 使用模板内所有像素的平均值代替模板中心像素灰度值 | 易收到噪声的干扰,不能完全消除噪声,只能相对减弱噪声 |
| 中值滤波 | 计算模板内所有像素中的中值,并用所计算出来的中值体改模板中心像素的灰度值 | 对噪声不是那么敏感,能够较好的消除椒盐噪声,但是容易导致图像的不连续性 |
| 高斯滤波 | 对图像邻域内像素进行平滑时,邻域内不同位置的像素被赋予不同的权值 | 对图像进行平滑的同时,同时能够更多的保留图像的总体灰度分布特征 |
轮廓检测
api:
OpenCV-Python教程(11、轮廓检测)_sunny2038的专栏-CSDN博客_轮廓检测
原理:
OpenCV轮廓提取算法详解findContours() - 知乎 (zhihu.com)
OpenCv绘制轮廓+边框_dujuancao11的博客-CSDN博客
Opencv笔记——findContours函数_殷硕的专栏-CSDN博客
opencv 轮廓判别法(find contour)使用详解_bboytd_lyg的博客-CSDN博客
ROI
opencv探索之路(十二):感兴趣区域ROI和logo添加技术 - Madcola - 博客园 (cnblogs.com)
Region Of Interest– 感兴趣区域
作用:在图片中框定一个区域单独处理
没卵用
帧差法 vs 三帧差
视频监控中运动物体检测与跟踪—-相邻帧差法和三帧差法 - 未雨愁眸 - 博客园 (cnblogs.com)
总结:帧差法在物品快速移动式会出现双边轮廓,三帧差法该善了该情况
方法:
- 帧差法:前后帧做差
- 三帧差法:三帧(前中后),前中、中后分别做差,然后与运算
背景更新
OpenCV: Motion Analysis and Object Tracking
api: cv2.accumulateWeighted(src, dst, alpha, mask=...)
描述:更新一个运行时的均数,将src与加权之后的dst求和 \(\text{dst}(x,y)←(1−\text{alpha})⋅\text{dst}(x,y)+\text{alpha}⋅\text{src}(x,y) \\ \text{if}\ \text{mask}(x,y)≠0\) 参数要求
- src:1通道或3通道,8位或32位浮点数
- dst:和src通道数相同,32位或64位浮点数
- alpha:0-1
- mask:可选
典型用例
- 先把image拷贝再用astype转换为float
- 调用api
Python Examples of cv2.accumulateWeighted (programcreek.com)
def run_avg(image, aWeight):
global bg
# initialize the background
if bg is None:
bg = image.copy().astype("float")
return
# compute weighted average, accumulate it and update the background
cv2.accumulateWeighted(image, bg, aWeight)
BackgroundSubtractor
java - What is the meaning of “history” inside BackgroundSubtractorMOG2? - Stack Overflow
在图片上添加文字
OpenCV显示文字_kingroc的博客-CSDN博客_opencv 文字
cv2.putText(image, text, org, font, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])