自定义线性滤波
主要内容
- 卷积概念
- 常见算子
- 自定义卷积模糊
卷积概念
卷积是图像处理中的一个操作,是kernel在图像中的每个像素的操作。
Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点。
说白了Kernel就是卷积核。
卷积如何工作
把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值成为卷积处理。
个人理解
首先,我认为卷积可以是3x3的,但是不限于3x3的一个矩阵(可以更大)。他可以贴在图像的左上角开始一点一点移动,操作图像。但是我的感觉这个操作方式弊端就是边缘位置会漏掉,可能更大的卷积核就会漏掉更多,也可呢个就是学长们说的细节少了。
常见算子
Robert算子
Robert算子是我们Canny边缘检测时,经常使用的一个算子。
// Robet_x Mat kernel_x = (Mat_<int>(2,2) << 1, 0, 0, -1); filterD(src, dst, -1, kernel_x, Point(-1, -1), 0.0); // Robet_y Mat kernel_y = (Mat_<int>(2,2) << 0, 1, -1, 0); filterD(src, dst, -1, kernel_y, Point(-1, -1), 0.0);
拉普拉斯算子
拉普拉斯算子属于空间锐化滤波操作。
// 拉普拉斯算子 Mat kernel = (Mat_<int>(3,3) << 0, -1, 0, -1, -1, -1, 0, -1, 0); filterD(src, dst, -1, kernel, Point(-1, -1), 0.0);
sobel算子
Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
// sobel_x Mat kernel_x = (Mat_<int>(3,3) << -1, 0, 1, -2, 0, 2, -1, 0, 1); filterD(src, dst, -1, kernel_x, Point(-1, -1), 0.0); // sobel_y Mat kernel_y = (Mat_<int>(3,3) << -1, -2, -1, 0, 0, 0, 1, 2, 1); filterD(src, dst, -1, kernel_y, Point(-1, -1), 0.0);
自定义卷积模糊
filter2D方法filter2D( Mat src, //输入图像 Mat dst, // 模糊图像 int depth, // 图像深度32/8 Mat kernel, // 卷积核/模板 Point anchor, // 锚点位置 double delta // 计算出来的像素+delta )
其中 kernel是可以自定义的卷积核