阅读 16

Android OpenCV(十九):方框滤波

方框滤波

方框滤波和均值滤波核基本上是一致的,主要的区别是要不要归一化处理,如果使用归一化处理,方框滤波就是均值滤波。

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()
    }
}
复制代码

效果

boxFilter归一化

boxFilter未归一化

sqrBoxFilter归一化

sqrBoxFilter未归一化

源码

github.com/onlyloveyd/…