opencv的线性滤波可以为图像添加一些效果,比如模糊,降噪,锐化,腐蚀与膨胀等,当然我们也可以自己来定义核来实现一些特殊的效果.
那么上面提到的核是什么呢?
核可以看做是沿着图像像素移动的一个窗口,它遍历图片的每个像素,并且将计算后的结果输出到该像素,通过这样的一个图可以更直观的理解这个概念. 核说白了就是一个固定大小的数值数组。该数组带有一个 锚点 ,一般位于数组中央. 它类似于这样 .
以下引用自opencv中文教程
假如你想得到图像的某个特定位置的卷积值,可用下列方法计算:
用公式表示上述过程如下:
说实话,这个运算过程我真没有看懂(如果大家有能看明白的希望能讲一下),但这并不影响我们去使用它,因为幸运的是,OpenCV已经为我们提供了函数 filter2D
来实现了这些运算,我们并不需要自己去实现.
上面算是说了关于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;
}
}
效果:
核心代码:
//
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);
//
效果:
核心代码:
/**
* 腐蚀运算
*/
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
本文为作者原创,转载请注明出处.