您的位置:首页 > 移动开发 > Android开发

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

2017-01-01 14:32 519 查看
在网上找了好多股价提取的实例,有关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的开发环境搭建过程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: