【Android】opencv图像处理之提取骨架

在网上找了好多股价提取的实例,有关android的,实在都不能用,最后只好动手按照书中的算法实现,记录在此。

算法参看自《数字图像处理(第三版)》Rafae C.Gonzalez, Richard E. Woods著, 阮秋琦 阮宇智 等译,
第418页。
这里写图片描述

代码如下

 /**
     * 骨架
     * 参考http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/
     * @param picture
     * @param picture_result
     */
    public static void skeleton(ImageView picture, ImageView picture_result){
        picture.setDrawingCacheEnabled(true);
        picture.buildDrawingCache();
        Bitmap bitmap = ((BitmapDrawable) picture.getDrawable()).getBitmap();
        System.loadLibrary("opencv_java3");
        Mat src = new Mat();
        Utils.bitmapToMat(bitmap, src);
        Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY);//转换成灰度图
        Imgproc.threshold(src, src, 1, 255,Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);//阈值处理,将灰度图处理成二值图
        Mat dst = src.clone();

        int K = 0;//腐蚀至消失的次数
        Mat element =  Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, new Size(3,3));
        Mat res = null;//骨架操作的结果
        do{
                Mat  dst2 = new Mat();
                Imgproc.morphologyEx(dst, dst2,  Imgproc.MORPH_OPEN, element);//图像开操作
                Mat tmp = new Mat();
                Core.subtract(dst, dst2, tmp);//图像减操作
                if(res == null){
                    res = tmp;
                }else {
                    Core.add(tmp, res, res);//图像加操作
                }
                K++;
                Imgproc.erode(src, dst, element, new Point(-1, -1), K);//图像腐蚀
        }while (Core.countNonZero(dst) > 0);

        ConstantMorph.MY_MAT = res;//操作结果
        ConstantMorph.MY_COUNT = K;//记录下操作次数,用于骨架重构

        Bitmap tmpbitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(res, tmpbitmap);
        picture_result.setImageBitmap(tmpbitmap);
        picture.setDrawingCacheEnabled(false);
    }

处理结果如下图
这里写图片描述

代码可以从如下地址获取
https://github.com/carlzhangweiwen/autumnsinger_opencv/blob/master/app/src/main/java/com/autumnsinger/opencv/util/PictureUtils.java

android环境opencv开发搭建过程:Android Studio中Opencv的开发环境搭建过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值