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