package com.example.opencvapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
public class Expt_4 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_expt4);
//初始化加载OpenCV
OpenCVLoader.initDebug();
//通过id查找按钮
Button button_go_home4 = findViewById(R.id.go_home4);
//添加按钮点击响应
button_go_home4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//界面跳转
startActivity(new Intent(Expt_4.this,MainActivity.class));
}
});//
Button btn_mean_filter = findViewById(R.id.btn_mean_filter);
Button btn_gaussian_filter = findViewById(R.id.btn_gaussian_filter);
Button btn_median_filter = findViewById(R.id.btn_median_filter);
Button btn_custom_filter = findViewById(R.id.btn_custom_filter);
Button btn_restore_4 = findViewById(R.id.btn_restore_4);
ImageView img_expt_4 =findViewById(R.id.img_expt_4);
btn_mean_filter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.noise);
Mat src = new Mat();
Utils.bitmapToMat(bitmap,src);
Mat dst = new Mat();
Imgproc.blur(src,dst,new Size(30,30));
Utils.matToBitmap(dst,bitmap);
img_expt_4.setImageBitmap(bitmap);
dst.release();
src.release();
}
});
btn_gaussian_filter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.noise);
Mat src = new Mat();
Utils.bitmapToMat(bitmap,src);
Mat dst = new Mat();
Imgproc.GaussianBlur(src,dst,new Size(0,0),
15,0, Core.BORDER_DEFAULT);
Utils.matToBitmap(dst,bitmap);
img_expt_4.setImageBitmap(bitmap);
dst.release();
src.release();
}
});
btn_median_filter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.noise);
Mat src = new Mat();
Utils.bitmapToMat(bitmap,src);
Mat dst = new Mat();
Imgproc.medianBlur(src,dst,11);
Utils.matToBitmap(dst,bitmap);
img_expt_4.setImageBitmap(bitmap);
dst.release();
src.release();
}
});
btn_custom_filter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.original);
Mat src = new Mat();
Utils.bitmapToMat(bitmap,src);
Imgproc.cvtColor(src,src,Imgproc.COLOR_RGBA2GRAY);
//定义X和Y方向的模板,计算梯度
Mat temp_x = new Mat(3,3,CvType.CV_32F);
Mat temp_y = new Mat(3,3,CvType.CV_32F);
float [] gradient_x = new float [] {-3,0,3,-10,0,10,-3,0,3};
float [] gradient_y = new float [] {-3,-10,-3,0,0,3,10,3};
temp_x.put(0,0,gradient_x);
temp_y.put(0,0,gradient_y);
Mat dst_x = new Mat();
Mat dst_y = new Mat();
Imgproc.filter2D(src,dst_x, CvType.CV_32F,temp_x);
Core.convertScaleAbs(dst_x,dst_x);
Imgproc.filter2D(src,dst_y, CvType.CV_32F,temp_y);
Core.convertScaleAbs(dst_y,dst_y);
Mat dst = new Mat();
Core.addWeighted(dst_x,0.5,dst_y,0.5,0,dst);
dst.convertTo(dst,CvType.CV_8U);
Imgproc.threshold(dst,dst,60,255,Imgproc.THRESH_BINARY);
Utils.matToBitmap(dst,bitmap);
img_expt_4.setImageBitmap(bitmap);
src.release();
dst.release();
temp_x.release();
temp_y.release();
dst_x.release();
dst_y.release();
}
});
btn_restore_4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.noise);
img_expt_4.setImageBitmap(bitmap);
}
});
}
}