opencv------卷积操作

filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

  • ddepth 是卷积之后图片的位深,即卷积之后图片的数据类型,一般为-1,表示和原图类型一致
  • kernel 是卷积核大小,用元组或者ndarray表示,要求数据类形必须是float型
  • anchor 锚点,即卷积核的中心店,是可选参数,默认是(-1,-1)
  • delta 可选参数,表示卷积之后额外加的一个值,相当于线性方程中的片叉,默认是0
  • borderType 边界类型,一般不设

卷积的应用:

图像处理:

       用一个模板和一幅图像进行卷积,对于图像上的一个点,让模板的原点和该点重合,然后模板上的点和图像上对应的点相乘,然后各点的积相加,就得到了该点的卷积值。对图像上的每个点都这样处理。由于大多数模板都是对称的,所以模板不旋转。卷积是一种积分运算,用来求两个曲线重叠区域面积。可以看作加权求和,可以用来消除噪声、特征增强。

把一个点的像素值用它周围的点的像素值的加权平均代替。

卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。

卷积在数据处理中用来平滑,卷积有平滑效应和展宽效应.

信号处理:

1)卷积实质上是对信号进行滤波;

2)卷积就是用冲激函数表示激励函数,然后根据冲击响应求解系统的零状态响应。卷积是求和(积分)。对于线性时不变的系统,输入可以分解成很多强度不同的冲激的和的形式(对于时域就是积分),那么输出也就是这些冲激分别作用到系统产生的响应的和(或者积分)。所以卷积的物理意义就是表达了时域中输入,系统冲激响应,以及输出之间的关系。

二、理解图像处理中卷积操作的实际过程

卷积:是图像处理中一个操作,是kernel在图像的每个像素上的操作。

Kernel:本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)

                     opencv------卷积操作_第1张图片                                      

那么,卷积具体怎么工作的呢?

假设想知道图像中某个特定位置的结果值。卷积的值以下列方式计算:
1) 将核的锚点(中心点)放在要计算像素上,卷积核剩余的部分对应在图像相应的像素上。
2) 用卷积核中的系数和图像中相应的像素值相乘,并求和。
3) 将最终结果赋值给锚点对应的像素。
4) 通过将核在整个图像滑动,重复以上计算过程直到处理完所有的像素。表达式如下:

                                  

利用卷积进行滤波处理过程,如下图所示,最左边是模板,中间的绿点是锚点;

opencv------卷积操作_第2张图片

       但是,图像卷积的时候边界像素,不能被卷积操作,进而产生边缘问题。原因在于边界像素没有完全跟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()

opencv------卷积操作_第3张图片

 

你可能感兴趣的:(opencv,opencv,计算机视觉,cnn)