您的位置:首页 > 运维架构

使用filter2D创建自定义线性滤波器

2015-08-04 09:52 651 查看
1、函数原型

void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Pointanchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )

该函数可使用任意自定义卷积核在输入图像上进行卷积运算,而且可以实现就地转换(In-place operation is supported)。
2、参数分析

src:源图像

dst:目标图像

ddepth:dst的深度,若为负值(如-1),则表示其深度与源图像相等。

kernel:用来遍历图像的核

anchor:核的锚点的相对位置,其中心点默认为(-1,-1)。

delta:在卷积的过程中,该值会加到每个像素上。默认情况下,这个值为0。

BORDER_DEFAULT:像素插值方法,这里为默认值,详细可以参照borderInterpolate()方法。

3、卷积核&锚点

卷积核:卷积核本质上是一个大小固定、由数值参数构成的数组,一个特殊卷积所实现的功能是由其卷积核的形式决定的。

锚    点:数组的参考点(anchor point,也叫锚点)通常位于数组(卷积核)的中心。

举    例:下图描述了一个以数组中心为参考点的3X3的卷积核,-4所在为锚点。若要计算图像上某个点的卷积值,则将卷积核的锚点定位到图像上的那个点,让核的其它元素覆盖图像中的相应的像素点。将图像上的点与卷积核对应相乘后再求和,并将这个结果放在图像上锚点的相对位置上。通过在图像上扫描卷积核,对图像的每个点重复此操作。

                                                                                                                                          

4、应用举例

使用Gabor滤波器对原图像(src)进行滤波操作得到滤波后的图像(src_filted)

Mat getGaborFeature(Mat src, int theta, int lambd, int KernelSize)
{
Mat src_filted;
src_filted.create(src.size(), src.type());
Mat GK = getGaborKernel(Size(KernelSize, KernelSize), 2 * CV_PI, (theta * CV_PI) / 8, lambd, CV_PI / 2, CV_32F);
filter2D(src, src_filted, -1, GK, Point(-1,-1));
return src_filted;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenCV