OpenCV--032:自定义的滤波器
程序员文章站
2023-12-23 17:53:27
...
前面已经对图像进行了模糊处理,介绍了几种滤波算法。OpenCV中还可以通过相应API来定义卷积操作,也就是设定自定义的卷积算子。
下面三个自定义的卷积核就分别可以实现均值模糊、图像锐化和图像梯度的功能:
OpenCV中API
-
函数说明
将图像与内核卷积。
该函数将任意线性滤波器应用于图像。支持就地操作。当光圈部分位于图像外部时,该函数会根据指定的边框模式对异常像素值进行插值。
该函数实际上会计算相关性,而不是卷积:
对于足够大的内核(〜11 x 11或更大),该函数使用基于DFT的算法,对于较小的内核,该函数使用直接算法。 -
函数声明
void filter2D( InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor = Point(-1,-1), double delta = 0, int borderType = BORDER_DEFAULT );
-
函数参数
src 输入图像 dst 和src具有相同尺寸和类型的输出图像 ddepth 目标图像的所需深度。ddepth默认为-1,此时表示输入与输出图像类型一致 kernel 卷积核(或一个相关核),一个单通道浮点矩阵;如果要将不同的内核应用于不同的通道,请使用split将图像分为单独的色彩平面,并分别进行处理。 anchor 内核的锚点,指示内核中已过滤点的相对位置;锚点应位于内核内;默认值(-1,-1)表示锚位于内核中心。 delta 在将像素存储到dst之前将其添加到过滤后的像素的可选值。 ddepth,当涉及到浮点数计算或者计算会产生负值的时候,需要将ddepth设为CV_32F类型,在滤波完成之后在使用下面的convertScaleAbs函数将图像从浮点型转为字节类型。
void convertScaleAbs( InputArray src, OutputArray dst, double alpha = 1, double beta = 0);
-
举例应用
int main() { Mat src = imread("D:/test/src.jpg"); Mat kernel1 = Mat::ones(5, 5, CV_32F) / (float)(5 * 5); //kernel定义则使用了重载 Mat kernel2 = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5 ,- 1, 0, -1, 0); Mat kernel3 = (Mat_<int>(2, 2) << 1, 0, 0, -1); Mat dst1, dst2, dst3, dst4; filter2D(src, dst1, -1, kernel1); filter2D(src, dst2, -1, kernel2); //浮点数计算或者计算会产生负值的时候, //需要将ddepth设为CV_32F类型, //在滤波完成之后在使用下面的convertScaleAbs函数将图像从浮点型转为字节类型。 filter2D(src, dst3, CV_32F, kernel3); convertScaleAbs(dst3, dst3); imshow("src", src); imshow("dst1", dst1); imshow("dst2", dst2); imshow("dst3", dst3); waitKey(0); return 0; }
推荐阅读
-
OpenCV--032:自定义的滤波器
-
R语言ggplot2x轴顺序设置自定义颜色的操作
-
IDEA中如何自定义类的注释和方法的注释
-
vue.js通过自定义指令实现数据拉取更新的实现方法
-
php生成随机密码的自定义函数(转载分享),php自定义
-
在React中使用Native如何实现自定义下拉刷新上拉加载的列表
-
Android 入门第十讲02-广播(广播概述,使用方法(系统广播,自定义广播,两个activity之间的交互和传值),EventBus使用方法,数据传递,线程切换,Android的系统广播大全)
-
Android实现带数字的圆形进度条(自定义进度条)
-
php自定义类fsocket模拟post或get请求的方法_PHP
-
Android实现自定义加载框的代码示例