参考:

【OpenCV学习笔记】之卷积及卷积算子(convolution)_点滴成海~的博客-CSDN博客_卷积算子(关于卷积运算)

opencv RNG函数 - 0MrMKG - 博客园(对于RNG函数的解答)

(一)首先是对于边缘的填充(避免有些像素卷积不了)

C++ void copyMakeBorder(Mat src, // 输入图像Mat dst, // 添加边缘图像int top, // 边缘长度,一般上下左右都取相同值,int bottom,int left,int right, int borderType // 边缘类型Scalar value )

关于borderType的值:

- BORDER_CONSTANT – 填充边缘用指定像素值- BORDER_REPLICATE – 填充边缘像素用已知的边缘像素值。- BORDER_WRAP – 用另外一边的像素来补偿填充
下面实现对于图片边缘地区进行填补像素:#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{Mat Origin = imread("0003.jpg");if (!Origin.data){cout << "ERROR" << endl;return -1;}Mat OutPut1 = Mat(Origin.size(), Origin.type());Mat OutPut2 = Mat(Origin.size(), Origin.type());Mat OutPut3 = Mat(Origin.size(), Origin.type());int added_cols = Origin.cols * 0.06;int added_rows = Origin.rows * 0.06;RNG rng(14);Scalar color = (rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));copyMakeBorder(Origin, OutPut1, added_cols, added_cols, added_rows, added_rows,BORDER_ISOLATED, color);copyMakeBorder(Origin, OutPut2, added_cols, added_cols, added_rows, added_rows,BORDER_DEFAULT, color);copyMakeBorder(Origin, OutPut3, added_cols, added_cols, added_rows, added_rows, BORDER_CONSTANT, color);imshow("OUTPUT    BORDER_ISOLATED", OutPut1);imshow("OUTPUT    BORDER_DEFAULT", OutPut2);imshow("OUTPUT    BORDER_CONSTANT", OutPut3);waitKey(0);}

(二)卷积运算代码基础

<1>自定义卷积模糊:

卷积核的定义,以及调用卷积核的函数Api:

 Mat Model = (Mat_<char>(3,3) << 1, 0, 0, 0, 1, 0, 0, 0, 1);
C++ void filter2D(Mat src, //输入图像Mat dst, // 模糊图像int depth, // 图像深度32/8Mat kernel, // 卷积核/模板Point anchor, // 锚点位置double delta // 计算出来的像素+delta)其中 kernel是可以自定义的卷积核
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{Mat Input = imread("0004.jpg");Mat Output_1 = Mat(Input.size(), Input.type());Mat Output_2 = Mat(Input.size(), Input.type());Mat Output_3 = Mat(Input.size(), Input.type());if (!Input.data){cout << "ERROR" << endl;return -1;}Mat Model_1 = (Mat_<char>(3,3) << 0, 1 , 0, 0, 1, 0, 0, 1, 0);Mat Model_2 = (Mat_<char>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);Mat Model_3 = (Mat_<char>(3, 3) << 0, -1, 0, -1, 4, -1, 0, -1, 0);Point ANCHOR = Point(-1, -1);filter2D(Input, Output_1,-1, Model_1,ANCHOR,BORDER_DEFAULT);filter2D(Input, Output_2, -1, Model_2, ANCHOR,100, BORDER_DEFAULT);filter2D(Input, Output_3, -1, Model_3, ANCHOR,100 ,BORDER_DEFAULT);imshow("input", Input);imshow("output1", Output_1);imshow("output2", Output_2);imshow("output3", Output_3);waitKey(0);
}

<2>Sobel算子:

关于sobel算子具体内容,移步:

科学网—Sobel算子的数学基础 - 彭真明的博文

OpenCV函数Sobel算子详解-代码狗

C++ void Sobel ( InputArray Src // 输入图像OutputArray dst// 输出图像,大小与输入图像一致int depth // 输出图像深度. Int dx  // X方向,几阶导数int dy // Y方向,几阶导数 int ksize, SOBEL算子kernel大小,必须是1、3、5、7、double scale  = 1double delta = 0int borderType = BORDER_DEFAULT)参数解释:
src:原图ddepth:处理结果图像深度,一般我们都填-1,即与原图深度相同。但在这里我们需要填写cv2.CV_64F。简单来说就是如果填写-1,我们在计算梯度时产生的负数就会被程序默认为0,导致有一边的边缘出不来。而cv2.CV_64F范围更大,可以保留负数。dx:计算x方向的梯度dy:计算y方向的梯度ksize:卷积核的尺寸。默认为3,即3*3的矩阵。原文链接:https://blog.csdn.net/weixin_45939019/article/details/104410567
//改进版本的sobel算子:C++ void Scharr (                    InputArray Src // 输入图像                    OutputArray dst// 输出图像,大小与输入图像一致                    int depth // 输出图像深度.                     Int dx.  // X方向,几阶导数                    int dy // Y方向,几阶导数.                     double scale  = 1                    double delta = 0                    int borderType = BORDER_DEFAULT)

(to be continued。。。。。。)

(三)常用卷积核

以下为原图片:

<1>什么都不处理(3*3)

很容易理解,就是0*8+中间原像素值

<2>图像锐化滤波器Sharpness Filter(3*3)(梯度锐化和拉普拉斯锐化)

注意一下,中间值为8就是边缘检测,为9就是原图的图像锐化

另外,如果卷积核更大,则锐化的程度也会更细致。

具体分析见:

Matlab图像处理—锐化滤波器__三三_的博客-CSDN博客_锐化滤波

<3>边缘检测Edge Detection

相当于求导的离散版本:你将当前的像素值减去前一个像素值,这样你就可以得到这个函数在这两个位置的差别或者斜率。

上面的是垂直边缘检测,以此类推,可以实现水平和斜向45度的边缘检测。

<4>Canny边缘检测Edge Detection

<5>浮雕Embossing Filter

浮雕滤波器可以给图像一种3D阴影的效果。只要将中心一边的像素减去另一边的像素就可以了。这时候,像素值有可能是负数,我们将负数当成阴影,将正数当成光,然后我们对结果图像加上128的偏移。这时候,图像大部分就变成灰色了。(转载)

这里我将灰度值调高了100

<6>均值模糊Box Filter (Averaging)

注意这里的1应该是十三分之一,这里没有处理,只是将最后输出的图片的灰度值更改了。

均值就得求平均。

你想要更模糊的效果,加大滤波器的大小即可。或者对图像应用多次模糊也可以。

<7>高斯模糊

  均值模糊很简单,但不是很平滑。高斯模糊就有这个优点,所以被广泛用在图像降噪上。特别是在边缘检测之前,都会用来移除细节。高斯滤波器是一个低通滤波器。(转载)

低通滤波可以简单的认为:设定一个频率点,当信号频率高于这个频率时不能通过,在数字信号中,这个频率点也就是截至频率,当频域高于这个截止频率时,则全部赋值为0。因为在这一处理过程中,让低频信号全部通过,所以称为低通滤波。

低通过滤的概念存在于各种不同的领域,诸如电子电路,数据平滑,声学阻挡,图像模糊等领域经常会用到。

在数字图像处理领域,从频域看,低通滤波可以对图像进行平滑去噪处理。

//_src _IN_ 输入的源影像
//_dst _OUT_ 输出的目标影像
//kSize 核大小 如果大小为负数的话,那么根据输入的sigma进行计算
//ksize 大小可以为1,3,5,7,最大值为7
//计算的公式为 sigma = 0.3\*((ksize - 1)\*0.5 - 1) + 0.8
//sigmal1 X方向上的sigma值
//sigmal2 Y方向上的sigma值
//如果sigmal值为负数的话,那么使用默认的滤波过滤器
void cv::GaussianBlur( InputArray _src, OutputArray _dst, Size ksize,double sigma1, double sigma2,int borderType )

<8>运动模糊Motion Blur

(to be continued.......)

(还有很多要补充的)

【15】opencv卷积运算相关推荐

  1. 【OpenCV 例程200篇】52. 图像的相关与卷积运算

    [OpenCV 例程200篇]52. 图像的相关与卷积运算 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 滤波通常是 ...

  2. 机器学习入门(15)— 全连接层与卷积层的区别、卷积神经网络结构、卷积运算、填充、卷积步幅、三维数据卷积、多维卷积核运算以及批处理

    卷积神经网络(Convolutional Neural Network,CNN)CNN 被用于图像识别.语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以 CNN 为基础. 1. 全连 ...

  3. OpenCV图像处理使用笔记(七)——卷积运算原理

    前言 1.在图像处理中,特别在深度学习图像处理,最常看到图像卷积操作,那什么是卷积呢,卷积就是两个原函数产生一个新的函数,两个函数之间的这种操作就称着卷积,在图像这里的图像卷积也用输入的图像矩阵与一个 ...

  4. opencv学习(七)之图像卷积运算函数filter2D()

    接上篇 在其官方文档中,filter2D()函数在掩模板介绍中一笔带过,我认为该函数应该进行详细介绍. 对于使用掩模板矩阵(kernel)计算每个像素值,结合函数filter2D()函数,其定义如下: ...

  5. 毕业设计 : 车牌识别系统实现【全网最详细】 - opencv 卷积神经网络 机器学习 深度学习

    文章目录 0 简介 1 车牌识别原理和流程 1.1 车牌定位 1.2 基于图形图像学的定位方法. 1.3 基于机器学习的定位方法. 1.4 字符分割 1.5 字符识别 2 基于机器学习的车牌识别 2. ...

  6. java 怎么做卷积运算,入门教程之算法系列(二):卷积运算与模糊操作

    卷积在信号处理领域有极其广泛的应用,也有严格的物理和数学定义. OpenCV中对图像进行模糊操作,其背后的原理就是卷积运算,可是究竟卷积运算是什么,模糊的卷积算法又是如何实现的呢?本文将进行讨论.考虑 ...

  7. Opencv卷积滤波cvFilter2D-高通与低通

    原文: http://blog.sina.com.cn/s/blog_6df50e1a01019z95.html 1.使用模板处理图像相关概念        模板:矩阵方块,其数学含义是一种卷积运算. ...

  8. OpenCV形态学运算

    1.OpenCV形态学运算morphologyEx(开运算 .闭运算 .形态学梯度 .顶帽运算 .黑帽运算 .腐蚀运算 .膨胀运算 .击中击不中运算) void cv::morphologyEx (I ...

  9. 序列的卷积运算与相关运算——MATLAB

    一.实验目的 1.掌握有限长序列线性卷积的编程计算原理,并能够利用Matlab或C语言编写算法程序进行线性卷积运算的程序实现; 2.学会线性卷积函数和线性相关函数的使用方法,并能利用二者进行有限长序列 ...

最新文章

  1. python制作adobe photoshop插件_Adobe Photoshop风格的后期处理和OpenCV
  2. 动画requestAnimationFrame
  3. Java学习笔记14
  4. 来源oa_骨性关节炎(OA)的初期管理——早点行动起来
  5. Collection集合中的 contains 和 remove 使用深入——为什么要重写equals() ?
  6. 释疑の字段符号 FIELD-SYMBOLS
  7. ACM基础之取消cin与stdio的同步
  8. CentOS6虚拟机下面配置双网卡
  9. [HZNOI #koishi] Magic
  10. 基于android新闻阅读器,Readian News是一款基于Android和网络的新闻阅读器,可让您掌控一切...
  11. Java int基本类型和Integer之间引发的问题思考
  12. MyBatis----resultMap的使用
  13. 一个简单的python小游戏
  14. WPF 加载GIF图片
  15. 思维万能体系——申论
  16. 第九篇:万丈高楼平地起-驱动编程基础知识点
  17. Rebuttal得来的经验
  18. 【冷冻电镜】Relion4.0——subtomogram教程
  19. [bzoj3611][Heoi2014]大工程
  20. Linux API 网址转换(DWORD, IP,域名)

热门文章

  1. 水果之王之猕猴桃-系列四(猕猴桃和奇异果的区别)
  2. 华为交换机N1软件包 License控制项说明及功能介绍
  3. 【数据处理】合取子句进化算法(CCEA)和析取范式进化算法(DNFEA)(Matlab代码实现)
  4. 关于Mongodb + java + 多表关联查询(MongoTemplate)
  5. Linux 内存映射mmap,内存映射mmap
  6. 计算机体系结构 第三章 流水线(Pipeline)技术
  7. php读取decimal显示00000,对decimal 类型的数据进行获取调整
  8. 如何使用OneDrive共享Microsoft Word文档
  9. 角色转换之间—我的2012年总结
  10. 社会网络中的心理学-----社交焦虑症