方框滤波
方框滤波和均值滤波核基本上是一致的,主要的区别是要不要归一化处理,如果使用归一化处理,方框滤波就是均值滤波。
API
public static void boxFilter(Mat src, Mat dst, int ddepth, Size ksize, Point anchor, boolean normalize, int borderType)
- 参数一:src,输入图像。
- 参数二:dst,输出图像,与输入图像具有相同的尺寸和通道数。
- 参数三:ddepth,输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。当赋值为-1时,输出图像的数据类型自动选择。
- 参数四:ksize,卷积核尺寸。
- 参数五:anchor,内核的基准点(锚点),默认值(-1,-1)代表内核基准点位于kernel的中心位置。基准点即卷积核中与进行处理的像素点重合的点,其位置必须在卷积核的内部。
- 参数六:normalize,是否将卷积核进行归一化的标志,默认参数为true,表示进行归一化
- 参数七:borderType,像素外推法选择标志。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
参数和图像卷积filter2D以及均值滤波比较类似,都是卷积操作,可见卷积运算的重要性
public static void sqrBoxFilter(Mat src, Mat dst, int ddepth, Size ksize, Point anchor, boolean normalize)
参数意义同上,只是sqrBoxFilter()函数实现对滤波器内每个像素数值的平方求和,之后根据输入参数选择是否进行归一化操作。
操作
/**
* 方框滤波
* author: yidong
* 2020/4/18
*/
class BoxFilterActivity : CardGalleryActivity() {
override fun buildCards() {
val bgr = Utils.loadResource(this, R.drawable.test)
val rgb = Mat()
Imgproc.cvtColor(bgr, rgb, Imgproc.COLOR_BGR2RGB)
addCardFromMat("原图", rgb)
val resultNormalize = Mat()
Imgproc.boxFilter(
rgb,
resultNormalize,
-1,
Size(9.0, 9.0),
Point(-1.0, -1.0),
true
)
addCardFromMat("boxFilter归一化", resultNormalize)
resultNormalize.release()
val resultUnNormalize = Mat()
Imgproc.boxFilter(rgb, resultUnNormalize, -1, Size(3.0, 3.0), Point(-1.0, -1.0), false)
addCardFromMat("boxFilter未归一化", resultUnNormalize)
resultUnNormalize.release()
val sqResult = Mat()
Imgproc.sqrBoxFilter(rgb, sqResult, CvType.CV_8U, Size(3.0, 3.0), Point(-1.0, -1.0), true)
addCardFromMat("sqrBoxFilter归一化", sqResult)
bgr.release()
rgb.release()
}
}
效果
源码
https://github.com/onlyloveyd/LearningAndroidOpenCV
扫码关注,持续更新
回复【计算机视觉】获取计算机视觉相关必备学习资料
回复【Android】获取Android,Kotlin必备学习资料