[Android]使用jni实现高斯模糊

1.高斯模糊的原理:

 

     根据周边的像素值来确定自己的像素值,平均值,最大值,最小值,正太分布值

2.均值模糊blur

函数声明:

CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );

 功能:对输入的图像src进行均值滤波后用dst输出。

参数:src和dst当然分别是输入图像和输出图像。size为均值滤波器模板大小。Anchor为锚点,如果为Point(-1,-1),则锚点是滤波器的中心点。borderType为边缘点插值类型。

理解:以原图对应像素为中心的与模板中心重叠,将模板覆盖领域内全部像素求均值就是滤波后像素的值了。

实现代码:

 //均值模糊
    //Size(w,h)的宽w高h只能是基数
    blur(image,image,Size(101,101),Point(-1,-1));

效果图:

          [Android]使用jni实现高斯模糊_第1张图片

              原图                                                   均值模糊后的图片

3.高斯模糊GaussianBlur

函数声明:

CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

功能:对输入的图像src进行高斯滤波后用dst输出。

参数:src和dst当然分别是输入图像和输出图像。Ksize为高斯滤波器模板大小,sigmaX和sigmaY分别为高斯滤波在横线和竖向的滤波系数。borderType为边缘点插值类型。

理解:数字图像的滤波可以简单的这么理解,就是对原图像的每一个像素滤波,那么对应这个像素滤波后的值是根据其相邻像素(包括自己那个点)与一个滤波模板进行相乘即可。所以具体到高斯滤波,我们只要知道这个高斯滤波的模板即可。

实现代码:

// 高斯模糊
    GaussianBlur(image, image, Size(101, 101), 0);

效果图:

              [Android]使用jni实现高斯模糊_第2张图片

          原图                                                     高斯模糊后的图片

4.整体代码:

注意在CMakelist文件中添加以下代码,不然编译的时候会报错

target_link_libraries( # Specifies the target library.
        #在target_link_libraries中添加下面的依赖项
        jnigraphics
        )
 

C++与java交互操作 :

import static com.demo.nightvision.jniTools.test;
public class jnitest extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jnitest);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.testjni);
        test(bitmap);
        ImageView image=findViewById(R.id.image);
        image.setImageBitmap(bitmap);
    }
}

public class jniTools {

    static {
        System.loadLibrary("native-lib");
    }

    public static native void test(Object bitmap);//jni学习

}

 native-lib.cpp:


extern "C"
JNIEXPORT void JNICALL
Java_com_demo_nightvision_jniTools_test(JNIEnv *env, jclass clazz, jobject bitmap) {
    AndroidBitmapInfo info;
    void *pixels;

    CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0);
    //判断图片是位图格式有RGB_565 、RGBA_8888
    CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
              info.format == ANDROID_BITMAP_FORMAT_RGB_565);
    CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0);
    CV_Assert(pixels);

    //将bitmap转化为Mat类
    Mat image(info.height, info.width, CV_8UC4, pixels);

    //均值模糊
    //Size(w,h)的宽w高h只能是基数
  // blur(image,image,Size(101,101),Point(-1,-1));

    // 高斯模糊
   GaussianBlur(image, image, Size(101, 101), 0);

}

记录一下学习内容

你可能感兴趣的:(算法,android,jni)