filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
卷积的应用:
图像处理:
用一个模板和一幅图像进行卷积,对于图像上的一个点,让模板的原点和该点重合,然后模板上的点和图像上对应的点相乘,然后各点的积相加,就得到了该点的卷积值。对图像上的每个点都这样处理。由于大多数模板都是对称的,所以模板不旋转。卷积是一种积分运算,用来求两个曲线重叠区域面积。可以看作加权求和,可以用来消除噪声、特征增强。
把一个点的像素值用它周围的点的像素值的加权平均代替。
卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。
卷积在数据处理中用来平滑,卷积有平滑效应和展宽效应.
信号处理:
1)卷积实质上是对信号进行滤波;
2)卷积就是用冲激函数表示激励函数,然后根据冲击响应求解系统的零状态响应。卷积是求和(积分)。对于线性时不变的系统,输入可以分解成很多强度不同的冲激的和的形式(对于时域就是积分),那么输出也就是这些冲激分别作用到系统产生的响应的和(或者积分)。所以卷积的物理意义就是表达了时域中输入,系统冲激响应,以及输出之间的关系。
二、理解图像处理中卷积操作的实际过程
卷积:是图像处理中一个操作,是kernel在图像的每个像素上的操作。
Kernel:本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)
那么,卷积具体怎么工作的呢?
假设想知道图像中某个特定位置的结果值。卷积的值以下列方式计算:
1) 将核的锚点(中心点)放在要计算像素上,卷积核剩余的部分对应在图像相应的像素上。
2) 用卷积核中的系数和图像中相应的像素值相乘,并求和。
3) 将最终结果赋值给锚点对应的像素。
4) 通过将核在整个图像滑动,重复以上计算过程直到处理完所有的像素。表达式如下:
利用卷积进行滤波处理过程,如下图所示,最左边是模板,中间的绿点是锚点;
但是,图像卷积的时候边界像素,不能被卷积操作,进而产生边缘问题。原因在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘没有被处理。
在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3x3在四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之后再去掉这些边缘。openCV中默认的处理方法是: BORDER_DEFAULT,此外
常用的还有如下几种:
- BORDER_CONSTANT – 填充边缘用指定像素值
- BORDER_REPLICATE – 填充边缘像素用已知的边缘像素值。
- BORDER_WRAP – 用另外一边的像素来补偿填充
————————————————
版权声明:本文为CSDN博主「点滴成海~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhu_hongji/article/details/81562746
代码:
import cv2
import numpy as np
dog=cv2.imread('./dog1.jpeg')
#img=cv2.cvtColor(dog,cv2.COLOR_BGR2GRAY)
#kernel必须是float型
#kernel=np.ones((5,5),np.float32)/25
#边缘检测
#kernel=np.array([[0,-1,0],[1,-4,1],[0,1,0]])
#浮雕
#kernel=np.array([[2,0,2],[0,0,0],[3,0,-6]])
#锐化
kernel=np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])
#平滑过滤
#kernel=np.array([[1,1,1],[1,1,1],[1,1,1]])
new_img=cv2.filter2D(dog,-1,kernel)
cv2.imshow('img',np.hstack((dog,new_img)))
print(dog.shape)
print(new_img.shape)
key=cv2.waitKey(0)
cv2.destroyAllWindows()