android-opencv之线性滤波.实现简单图像滤镜

opencv的线性滤波可以为图像添加一些效果,比如模糊,降噪,锐化,腐蚀与膨胀等,当然我们也可以自己来定义来实现一些特殊的效果.

核是什么?

那么上面提到的核是什么呢?

核可以看做是沿着图像像素移动的一个窗口,它遍历图片的每个像素,并且将计算后的结果输出到该像素,通过这样的一个图可以更直观的理解这个概念. 核说白了就是一个固定大小的数值数组。该数组带有一个 锚点 ,一般位于数组中央. 它类似于这样 .

opencv的核

如何用核实现卷积?

以下引用自opencv中文教程

假如你想得到图像的某个特定位置的卷积值,可用下列方法计算:

  1. 将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;
  2. 将核内各值与相应像素值相乘,并将乘积相加;
  3. 将所得结果放到与锚点对应的像素上;
  4. 对图像所有像素重复上述过程。

用公式表示上述过程如下:

核卷积运算公式

说实话,这个运算过程我真没有看懂(如果大家有能看明白的希望能讲一下),但这并不影响我们去使用它,因为幸运的是,OpenCV已经为我们提供了函数 filter2D 来实现了这些运算,我们并不需要自己去实现.

在android中实现图像滤波

上面算是说了关于opencv线性滤波器的一些理论的东西吧,下面我们就来说一说在android平台中,如何利用opencv来实现一个图像滤波器.

第一步当然就是把opencvsdk配置到我们的项目中来了,并且配置好了之后,我们还要进行load成功才可以使用.这一部分可以参照我的上一篇笔记

第二步则是调用opencv的函数,进行图像处理,下面是五种滤镜的效果,及实现代码.

简单滤镜之自定义核实现自己的线性滤波器

效果:

核心代码:

public class SharpenProcessor implements ImgProcessor {
    private Mat dec;
    private Mat src;
    private Bitmap bitmap_dec;

    private Mat kernel;

    @Override
    public void initProcessor(Bitmap bitmap_src) {
        bitmap_dec = Bitmap.createBitmap(bitmap_src.getWidth(), bitmap_src.getHeight(), Bitmap.Config.ARGB_8888);
        src = new Mat();
        dec = new Mat();
        Utils.bitmapToMat(bitmap_src, src);
        kernel = new Mat(3, 3, CvType.CV_16SC1);
    }

    @Override
    public void processor() {
        kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0);
        Imgproc.filter2D(src, dec, src.depth(), kernel);
        Utils.matToBitmap(dec, bitmap_dec);
    }

    public void processor(int progress) {
        kernel.put(0, 0, 0, -1, 0, -1, progress, -1, 0, -1, 0);
        Imgproc.filter2D(src, dec, src.depth(), kernel);
        Utils.matToBitmap(dec, bitmap_dec);
    }

    @Override
    public Bitmap getResult() {
        return bitmap_dec;
    }
}

简单滤镜之高斯模糊

效果:

opencv高斯模糊

核心代码:

//<editor-fold desc="高斯模糊">
ImageView image_src = (ImageView) findViewById(R.id.image_src);
ImageView image_result = (ImageView) findViewById(R.id.image_result);

Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Mat mat = new Mat(src.getWidth(), src.getHeight(), CvType.CV_8UC4);
Utils.bitmapToMat(src, mat);
Imgproc.blur(mat, mat, new Size(30, 30));
Bitmap bitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mat, bitmap);
image_src.setImageBitmap(src);
image_result.setImageBitmap(bitmap);
//</editor-fold>

简单滤镜之腐蚀

效果:

腐蚀腐蚀

核心代码:

/**
 * 腐蚀运算
 */
public class ErodeProcessor implements ImgProcessor {
    private Mat dec;
    private Mat src;
    private Bitmap bitmap_dec;

    private Mat kernel;

    @Override
    public void initProcessor(Bitmap bitmap_src) {
        bitmap_dec = Bitmap.createBitmap(bitmap_src.getWidth(), bitmap_src.getHeight(), Bitmap.Config.ARGB_8888);
        src = new Mat();
        dec = new Mat();
        Utils.bitmapToMat(bitmap_src, src);

    }

    @Override
    public void processor() {
        processor(3);
    }

    @Override
    public void processor(int wight) {
        kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(wight, wight));
        Imgproc.erode(src, dec, kernel);
        Utils.matToBitmap(dec, bitmap_dec);

    }

    @Override
    public Bitmap getResult() {
        return bitmap_dec;
    }
}

Demo:https://github.com/miqt/OpenCVLeaning
本文出自: https://blog.csdn.net/qq_27512671/article/details/79758773
本文为作者原创,转载请注明出处.

发布了46 篇原创文章 · 获赞 62 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/qq_27512671/article/details/79758773
今日推荐