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是一个滤波器,可去掉图像中的噪音,使图像更为平滑

高斯模糊


像素重映射


图像二值化


全局与自适应二值化


实施人脸检测

(未完待续)

参考资料:

  1. https://vxr.xet.tech/s/49dV3o datawhale教程
  2. https://www.zhihu.com/question/387551760#:~:text=传统的计算机视觉,测、SVM等等。 知乎答案
  3. https://www.cnblogs.com/weijiakai/p/15495607.html 数字图像处理——RGB与HSV图像互相转换原理
  4. https://blog.csdn.net/hihell/article/details/112335340 Python OpenCV setMouseCallback 回调函数,取经之旅第 13 天
  5. https://blog.csdn.net/a13602955218/article/details/84310394 cv2.calcHist()的使用
posted @ 2022-12-13 00:17  刘国栋_0017  阅读(206)  评论(0编辑  收藏  举报