cv2

传统cv基础以及opencv-python常用api记录

参考资料

OpenCV_sunny2038的专栏-CSDN博客

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不同具体效果不同

image-20211110154311623

图片基本操作

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博客

过滤可以移除图像中的噪音、提取感兴趣的可视特征、允许图像重采样,等等。

低通滤波

图像处理之低通滤波_约翰先生的博客-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

ROI(感兴趣区域)_百度百科 (baidu.com)

opencv探索之路(十二):感兴趣区域ROI和logo添加技术 - Madcola - 博客园 (cnblogs.com)

Region Of Interest– 感兴趣区域

作用:在图片中框定一个区域单独处理

没卵用

帧差法 vs 三帧差

视频监控中运动物体检测与跟踪—-相邻帧差法和三帧差法 - 未雨愁眸 - 博客园 (cnblogs.com)

总结:帧差法在物品快速移动式会出现双边轮廓,三帧差法该善了该情况

方法:

  1. 帧差法:前后帧做差
  2. 三帧差法:三帧(前中后),前中、中后分别做差,然后与运算

背景更新

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:可选

典型用例

  1. 先把image拷贝再用astype转换为float
  2. 调用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

c++ - How can I make openCV Backgroundsubtraction KNN algorithm last longer, tracking a foregound object which is not moving - Stack Overflow

在图片上添加文字

OpenCV显示文字_kingroc的博客-CSDN博客_opencv 文字

cv2.putText(image, text, org, font, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])