[关闭]
@evilking 2019-01-17T16:45:01.000000Z 字数 2716 阅读 933

OpenCV4Android开发

生成 Mat 对象

  1. Uri imageUri = imageIntent.getData();
  2. InputStream imageStream = getContentResolver().openInputStream(imageUri);
  3. Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
  4. src = new Mat(selectedImage.getHeight(), selectedImage.getWidth(), CvType.CV_8UC4);
  5. // 将 Bitmap 转成 Mat 供 opencv 使用
  6. Utils.bitmapToMat(selectedImage, src);
  7. // 可操作 Mat 对象

模糊处理

均值模糊

  1. Imgproc.blur(src, src, new Size(3,3))
  2. //处理完可预览操作效果
  3. Bitmap processedImage = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888);
  4. // Mat 对象转成 Bitmap 对象,供 android 使用
  5. Utils.matToBitmap(src, processedImage);
  6. // 原图
  7. ivImage.setImageBitmap(selectedImage);
  8. // 操作后的图
  9. ivImageProcessed.setImageBitmap(processedImage);

高斯模糊

  1. Imgproc.GaussianBlur(src, src, new Size(3,3), 0);

中值模糊

处理 淑盐噪声

  1. Imgproc.medianBlur(src, src, 3);

锐化

使用的卷积核为 :

  1. // 创建卷积核
  2. Mat kernel = new Mat(3,3, CvType.CV_16SC1);
  3. kernel.put(0,0, 0,-1,0,-1,5,-1,0,-1,0)
  4. // 锐化滤波
  5. Imgproc.filter2D(src, src, src.depth(), kernel);

形态学运算

膨胀

膨胀是一种将图像中亮区域扩张的方法。

  1. // 可以获得所需要的核
  2. Mat kernelDilate = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
  3. // 执行膨胀操作
  4. Imgproc.dilate(src, src, kernelDilate);

腐蚀

腐蚀是一种将图像中暗区域扩张的方法。腐蚀可以用来去除图像中的噪声。

  1. // 得到椭圆形的核
  2. Mat kernelErode = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(5, 5));
  3. // 腐蚀
  4. Imgproc.erode(src, src, kernelErode);

膨胀和腐蚀并不是逆运算

阈值化

  1. // 100 是阈值,255 是最大值(纯白色的值)
  2. Imgproc.threshold(src, src, 100, 255, Imgproc.THRESH_CONSTANT);

二值阈值化:THRESH_BINARY
阈值化到零:THRESH_TOZERO
截断阈值化:THRESH_TRUNC
反转二值阈值化:THRESH_BINARY_INV
反转阈值化到零:THRESH_TOZERO_INV

自适应阈值

  1. ADAPTIVE_THRESH_MEAN_C: 阈值是领域像素的均值
  2. ADAPTIVE_THRESH_GAUSSIAN_C: 阈值是领域像素的加权和,权重来自高斯核

块尺寸:即邻域的大小
常量 C:这是从对每个像素计算得到的均值或加权均值减去的常量

  1. Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY);
  2. Imgproc.adaptiveThreshold(src, src, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 3, 0);

旋转图片

  1. // 对 Bitmap 对象处理
  2. BitmapFactory.Options options = new BitmapFactory.Options();
  3. options.inSampleSize = 2;
  4. Bitmap temp = BitmapFactory.decodeFile(picturePath, options);
  5. // 获取方向信息
  6. int orientation = 0;
  7. try{
  8. ExifInterface imgParams = new ExifInterface(picturePath);
  9. orientation = imgParams.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
  10. } catch (IOException e){
  11. e.printStackTrace();
  12. }
  13. // 旋转图像,得到正确的方向
  14. Matrix rotate90 = new Matrix();
  15. rotate90.postRotate(orientation);
  16. originalBitmap = rotateBitmap(temp, orientation);
  17. //将 Bitmap 转换为 Mat

高斯差分技术

  1. Mat grayMat = new Mat();
  2. Mat blur1 = new Mat();
  3. Mat blur2 = new Mat();
  4. // 将图像转换为灰度
  5. Imgproc.cvtColor(originalMat, grayMat, Imgproc.COLOR_BGR2GRAY);
  6. // 以两个不同的模糊半径对图像做模糊处理
  7. Imgproc.GaussianBlur(grayMat, blur1, new Size(15, 15), 5);
  8. Imgproc.GaussianBlur(grayMat, blur2, new Size(21, 21), 5);
  9. // 将两幅模糊后的图像相减
  10. Mat DoG = new Mat();
  11. Core.absdiff(blur1, blur2, DoG);
  12. // 反转二值阈值化
  13. Core.multiply(DoG, new Scalar(100), DoG);
  14. Imgproc.threshold(DoG, DoG, 50, 255, Imgproc.THRESH_BINARY_INV);
  15. // 将 Mat 转换回位图
  16. Utils.matToBitmap(DoG, currentBitmap);
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注