转载: https://blog.csdn.net/hxg2006/article/details/ http://blog.csdn.net/chaipp0607/article/details/
https://www.zhihu.com/question/
在图像处理领域,我们经常能听到滤波,卷积之类的词,其实他们都可以看做一种图像的卷积操作,相对应的卷积核,卷积模板,滤波器,滤波模板,扫描窗其实也都是同一个东西。下面我们进一步讨论图像中的卷积操作核卷积的意义。
1、数字信号处理中卷积理解

链接:https://www.zhihu.com/question//answer/
来源:知乎
对于初学者,我推荐用复利的例子来理解卷积可能更好理解一些:
小明存入100元钱,年利率是5%,按复利计算(即将每一年所获利息加入本金,以计算下一年的利息),那么在五年之后他能拿到的钱数是
,如下表所示:
将这笔钱存入银行的一年之后,小明又往银行中存入了100元钱,年利率仍为5%,那么这笔钱按复利计算,到了第五年,将收回的钱数是
,我们将这一结果作为新的一行加入上面的表格中:
以此类推,如果小明每年都往银行中存入新的100元钱,那么这个收益表格将是这样的:
可见,最终小明拿到的钱将等于他各年存入的钱分别计算复利之后得到的钱数的总和,即:
用求和符号来简化这个公式,可以得到:
在上式中,
为小明的 存钱函数,而
为存入银行的每一笔钱的 复利计算函数。 在这里,小明最终得到的钱就是他的存钱函数和复利计算函数的卷积。
为了更清晰地看到这一点,我们将这个公式推广到连续的情况,也就是说,小明在从
到
的这一段时间内,每时每刻都往银行里存钱,他的存钱函数为
,而银行也对他存入的每一笔钱按复利公式计算收益:
,则小明到时间
将得到的总钱数为:
这也就是卷积的表达式了,上式可以记为
。
相信通过上面这个例子,大家应该能够很清晰地记住卷积公式了。下面我们再展开说两句:
如果我们将小明的存款函数视为一个 信号发生(也就是激励)的过程,而将复利函数
视为一个 系统对信号的响应函数(也就是响应),那么二者的卷积
就可以看做是在
时刻对系统进行观察, 得到的观察结果(也就是输出)将是过去产生的所有信号经过系统的「处理/响应」后得到的结果的 叠加,这也就是 卷积的物理意义了。
链接:https://www.zhihu.com/question//answer/
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://www.zhihu.com/question//answer/
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
想要形象地理解卷积这个数学概念,那么思路当然是找它的“实际应用”,最容易想到的例子就是它对动态系统的输入输出关系的描述了。许多答主提到了“打脸”的例子,非常形象,就不复述了。
以下略纠结,嫌麻烦可以跳过直接看图。
之前我对@镜面狐答案的有部分理解是不准确的;现在看来他对
的定义确实有问题(感谢@高启峰和@逐光指出)。顺便提一下,@镜面狐的答案引用了Franklin的那本经典教材,但是我越来越感觉它讲卷积的那部分并没有写得很清楚,比如它和配图和文字就对不上号,徒增了理解的难度。我尽量梳理一遍吧。
首先是单位脉冲
和单位脉冲响应
的定义,大家应该都懂我就不啰嗦了。(注意
的“面积”为
。)再是定义
和
,当
时趋近于
和
。(同样注意
的高度为
,面积为
。)
一个输入信号可以拆成很多
的和,即
(所以
取极限写成积分形式即 
注意不要忘了
,因为我们是要跟单位脉冲比较面积,即
是
的多少倍。
纠结部分完。
有了这个基础,再去理解卷积的公式就没那么intimidating了。放张图,心血来潮随手画的,但愿能顶个卵用。
另外,对于实际系统(因果系统),由于未来的打脸(
就行了;此外我们还一般假设
之前没人打脸并且脸也不肿,所以积分下限设为
就行了。因此
。
2、数字图像处理中卷积
数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。


2.1边界补充问题
原始图像:




2.2.4块复制

以上四种边界补充方法通过看名字和图片就能理解了,不在多做解释。
不同卷积核下卷积意义
该卷积核的作用在于取九个值的平均值代替中间像素值,所以起到的平滑的效果:
梯度Prewitt卷积核与Soble卷积核的选定是类似的,都是对水平边缘或垂直边缘有比较好的检测效果。
以上的水平边缘与垂直边缘检测问题可以参考:Soble算子水平和垂直方向导数问题
(7)梯度Laplacian:


代码实现
可以利用OpenCV提供的filter2D函数完成对图像进行卷积操作,其函数接口为:
-
CV_EXPORTS_W
void
filter2D(
-
InputArray src,
-
OutputArray dst,
-
int
ddepth,
-
InputArray kernel,
-
Point anchor=Point(-
1
,-
1
),
-
double
delta=
0,
-
int borderType=BORDER_DEFAULT );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
-
#include
-
#include
-
#include
-
#include
-
#include
-
using
namespace
std;
-
using
namespace cv;
-
-
int
main()
-
{
-
Mat srcImage = imread(
"1.jpg");
-
namedWindow(
"srcImage", WINDOW_AUTOSIZE);
-
imshow(
"原图", srcImage);
-
Mat kernel = (Mat_<
double>(
3,
3) <<
-
-
1,
0 ,
1,
-
-
2,
0,
2,
-
-
1,
0,
1);
-
Mat dstImage;
-
filter2D(srcImage,dstImage,srcImage.depth(),kernel);
-
namedWindow(
"dstImage",WINDOW_AUTOSIZE);
-
imshow(
"卷积图",dstImage);
-
waitKey(
0);
-
return
0;
-
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
所以代码的实现就非常简单了,不同的卷积操作只需要改变卷积核kernel 即可。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218553.html原文链接:https://javaforall.net
