DW组队学习——opencv框架
本篇是针对DataWhale组队学习项目——opencv框架而整理的学习笔记,主要是对自己不熟悉的内容进行记录。由于水平实在有限,不免产生谬误,欢迎读者多多批评指正。
基本情况
计算机视觉框架
传统计算机视觉算法主要使用概率统计、传统图像处理、机器学习等方法来完成各种计算机视觉任务
- SimpleCV
- BoofCV
- Dlib
- JavaCV
深度学习算法通用训练框架
- Caffe
- Tensorflow
- Pytorch
- Paddlepaddle
- Keras
深度学习计算机视觉部署框架
- OpenVINO
- TensorRT
- onnxruntime
- Deepface
- YOLO/DarkNet
- mmdetection
- Paddle-detection/seg/ocr
常用的开源计算机视觉库
- opencv
部分付费的计算机视觉库
- Halcon
- VisionPro
- Mil
opencv架构
opencv安装
基本操作
图像读取与显示
图像色彩空间转换
计算机默认色彩系统RGB,8位的RGB图像中红(Red)绿(Green)蓝(Blue)每个通道取值范围均为0-255,可转换为HSV或YCrCb等色彩系统,但色彩系统之间的转换可能带来信息损失。
HSV图像中:
H通道的像素值表示色调,取值范围0~360
S通道的像素值表示图像的饱和度,取值范围是0~1,值越大表示饱和度越高
V通道像素值表示图像的明亮程度,取值范围也是0~1,值越大表示越亮
效果如下图所示:
图像对象的创建与赋值
opencv中一切图像数据都是numpy数组,图像创建和赋值就是指对数组进行创建和赋值。
openCV支持的数据类型包括np.uint8、np.float32、np.int32、np.int64
像素读写操作
两种分辨率表示方式:ppi代表像素每英寸,常用于UI设计;dpi代表点每英寸,常用于平面印刷。
以RGB图像为例,图像数组数据image包含行row和列col,行列数值确定后,就找到了像素点image[row,col],该点的数据结构是一个三元数组(a, b, c),代表了图像中该位置像素的RGB数值。
在以下例子中我们通过255减去原像素RGB数值来修改原图像,得到一张新的图像
像素算术操作
像素数据之间可以做加减乘除,如img1[row, col]+ img2[row, col] = dst[row, col]
像素还可以做插入操作,如下所示
滚动条操作
Opencv中利用回调函数完成滚动条的事件响应与处理
课程中给出了一个可调节图片亮度的示例:
运行结果如下:
滚动条功能可以正常使用,但在关闭图片时会报一个错误,原因暂不清楚
键盘响应操作
颜色表操作
图像中的查找表(LUT)就是一个建立一个与像素有关的映射,以方便快速查找及减少计算量。
可使用系统自带的查找表,或自定义查找表
通道分离与合并
通过对RGB或HSV中通道的分离,可以提取所需的部分信息
图像统计信息
图像统计信息包括均值、方差和极值等,可用于辅助对图像进行处理。
如图像均值可用于提升或降低图像的对比度Dst = (Src-mean) * contrast。如下所示:
图像集合形状绘制
相关函数cv.line()画线、cv.circle()画圆、cv.rectangle()画正方形、cv.ellipse()画椭圆、cv.putText()显示文字
随机数与随机颜色
这里主要介绍的是利用numpy中的随机数生成函数结合cv2中的图像绘制函数来绘制随机图案。
教程中的示例会不断切换图像,按esc键(ASCII码为27)后停止,但python内核总是会挂掉,暂未找出原因。
多边形填充与绘制
多边形的绘制也比较简单,先定义一个点集作为多边形顶点坐标,而后利用cv2.polylines或cv2.fillPoly函数进行绘制即可
鼠标操作与响应
教程示例中给出的cv2.setMouseCallback函数中第二个参数代表鼠标事件和回调,需要自己定义
在此借鉴了参考资料4这篇博文,完成了左键点击后在图像上画圆圈的鼠标操作
图像像素类型转化与归一化
图像几何变换
视频读写处理
图像直方图
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) ->hist 该函数用于统计图片中像素的色彩(灰度)分布
imaes:输入的图像
channels:选择图像的通道
mask:掩膜,是一个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像
histSize:使用多少个bin(柱子),一般为256
ranges:像素值的范围,一般为[0,255]表示0~255
直方图均衡化
cv2.equalizeHist可将图像的灰度值变得分布均匀(分段进行归一化处理),实际上是增强了图像的对比度
处理前后的图像及其灰度分布:
图像卷积操作
cv.blur是一个滤波器,可去掉图像中的噪音,使图像更为平滑
高斯模糊
像素重映射
图像二值化
全局与自适应二值化
实施人脸检测
(未完待续)
参考资料:
- https://vxr.xet.tech/s/49dV3o datawhale教程
- https://www.zhihu.com/question/387551760#:~:text=传统的计算机视觉,测、SVM等等。 知乎答案
- https://www.cnblogs.com/weijiakai/p/15495607.html 数字图像处理——RGB与HSV图像互相转换原理
- https://blog.csdn.net/hihell/article/details/112335340 Python OpenCV setMouseCallback 回调函数,取经之旅第 13 天
- https://blog.csdn.net/a13602955218/article/details/84310394 cv2.calcHist()的使用