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));
效果图:
原图 均值模糊后的图片
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);
效果图:
原图 高斯模糊后的图片
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:文章来源:https://www.toymoban.com/news/detail-552402.html
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);
}
记录一下学习内容文章来源地址https://www.toymoban.com/news/detail-552402.html
到了这里,关于[Android]使用jni实现高斯模糊的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!