当前位置: 首页 > article >正文

OpenCV 卷积运算和卷积核

卷积运算和卷积核

图像运算中经常会碰到卷积运算这个讲法, 初看不知道具体含义, 其实非常简单, 工作原理如下:

  1. 首先提供一个小的矩阵, 一般是3*3, 或者是 5*5 或者是 7*7, 一般是方形矩阵, 维度为奇数, 这样中心点可以作为锚点, 矩阵中的元素取值多为很小的整数(或正或负或零), 该矩阵被叫做 kernel 或卷积核.
  2. 图像中每个点的最终取值, 需要和 kernel矩阵做个运算才能得到该点的最终取值, 计算过程为: 先将卷积核的锚点对中图像上要计算的点, 这样核矩阵和图像上一小块区域会重叠, 我们将重叠部分各个点做乘法运算, 并将乘积相加作为计算点的最终取值.
  3. 很显然, 卷积运算其实就是对原图像各点进行了加权平均, 卷积核上各点数值相当于权重, 一般图像往往具备各方同性特征, 所以我们一般选择核中心点作为锚点, 同时选择奇数维度的矩阵, 这样的矩阵中心点就非常明确.

卷积核的构建

OpenCV中的结构化元素专指数值为0和1的卷积核矩阵, 当然卷积核矩阵并不要要求数值一定是1或1.

  1. 手工构建: 卷积核就是个矩阵, 所以我们可以先创建一个Mat, 然后手工设定各位置取值就可以.
  2. 构建全为1元素的矩阵, 下面两个写法等价.
Mat element1 = Mat.Ones(3, 3, MatType.CV_8UC1);
Mat element2 = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3));

[  1,   1,   1,   1,   1;
   1,   1,   1,   1,   1;
   1,   1,   1,   1,   1;
   1,   1,   1,   1,   1;
   1,   1,   1,   1,   1]
  1. 构建是十字线为1的矩阵, 其他元素都为0
Mat element3 = Cv2.GetStructuringElement(MorphShapes.Cross, new OpenCvSharp.Size(3, 3));

[  0,   0,   1,   0,   0;
   0,   0,   1,   0,   0;
   1,   1,   1,   1,   1;
   0,   0,   1,   0,   0;
   0,   0,   1,   0,   0]
  1. 构建是椭圆形矩阵, 椭圆形区域内的元素为1, 其他元素都为0
Mat element4 = Cv2.GetStructuringElement(MorphShapes.Cross, new OpenCvSharp.Size(5, 5));

[  0,   0,   1,   0,   0;
   0,   0,   1,   0,   0;
   1,   1,   1,   1,   1;
   0,   0,   1,   0,   0;
   0,   0,   1,   0,   0]

参考

https://zhuanlan.zhihu.com/p/273475106https://blog.csdn.net/Vermont_/article/details/108424547


http://www.kler.cn/news/137294.html

相关文章:

  • 参与活动如何进行地区的限制
  • 力扣刷题第二十七天--二叉树
  • 安卓老项目改造为AndroidX
  • php字符串处理函数的使用
  • CMake 判断操作系统类型
  • git基本操作(配图超详细讲解)
  • 交叉编译tcpdump
  • 游戏中的资源动态加载
  • 重磅解读 | 阿里云 云网络领域关键技术创新
  • 入行IC | 从小白助理级,到总监专家级,到底要经历怎样的成长阶段呢?
  • go map字典操作
  • 卷积神经网络(VGG-19)灵笼人物识别
  • Python每日一练-DAY01
  • docker通过挂载conf文件启动redis
  • LeetCode39- 组合总和
  • 掌握深度学习利器——TensorFlow 2.x实战应用与进阶
  • scp rsync 软连接
  • linux控制台命令
  • OpenCV 中Mat.depth()的理解——每个像素的位数——每个像素中每个通道的精度
  • Qt中的tr函数