最近在研究图像出来这一块,网上查的比较多,试过基础的opencv 的抠图,效果不是很理想

opencv抠图参考

https://blog.csdn.net/u010302327/article/details/78898781

https://blog.csdn.net/hardWork_yulu/article/details/78757665

试了很多,最终找到一个还不错哦的,基本能完成自己想要的效果,那就是这个开源的modnet算法,基于PaddleSeg的MODNet算法实现人像抠图,但是一些复杂的图片还是不行,也花了很多时间,所以来分析一哈。

分享案例可以选择相册或者直接拍照体验哈

先来看看效果图:(可以替换成自己想要的背景图片)

功能:

  1. 在人像抠图Demo中,默认会载入一张人像图像,并会在图像下方给出CPU的预测结果和预测时延;
  2. 在人像抠图Demo中,你还可以通过右上角的"打开本地相册"和"打开摄像头拍照"按钮分别从相册或相机中加载测试图像然后进行预测推理;

关键代码:

 public Bitmap draw(Bitmap inputImage, Tensor outputTensor,Bitmap bg){float[] output = outputTensor.getFloatData();long outputShape[] = outputTensor.shape();int outputSize = 1;for (long s : outputShape) {outputSize *= s;}List<Float> arralist = new LinkedList<>();for (int i=0; i<outputSize;i++){arralist.add((float)output[i]);}Bitmap mALPHA_IMAGE = floatArrayToBitmap(arralist,(int)outputShape[3],(int)outputShape[2]);//调整尺寸Bitmap alpha = Bitmap.createScaledBitmap(mALPHA_IMAGE,inputImage.getWidth(),inputImage.getHeight(),true);Bitmap bgImg = Bitmap.createScaledBitmap(bg,inputImage.getWidth(),inputImage.getHeight(),true);//重新合成图像Bitmap result = synthetizeBitmap(inputImage,bgImg, alpha);return result;}//将float数组转成bitmap格式的图片private Bitmap floatArrayToBitmap(List<Float>  floatArray,int width,int height){byte alpha = (byte) 255 ;Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) ;ByteBuffer byteBuffer = ByteBuffer.allocate(width*height*4*3) ;float Maximum = Collections.max(floatArray);float minmum = Collections.min(floatArray);float delta = Maximum - minmum + 0.00000000001f ;int i = 0 ;for (float value : floatArray){byte temValue = (byte) ((((value-minmum)/delta)*255));byteBuffer.put(4*i, temValue) ;byteBuffer.put(4*i+1, temValue) ;byteBuffer.put(4*i+2, temValue) ;byteBuffer.put(4*i+3, alpha) ;i++;}bmp.copyPixelsFromBuffer(byteBuffer) ;return bmp ;}//将原图与背景按照推理得到的alpha图进行合成private Bitmap synthetizeBitmap(Bitmap front,Bitmap background, Bitmap alpha){int width = front.getWidth();int height = front.getHeight();Bitmap result=Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);int[] frontPixels = new int[width * height];int[] backgroundPixels = new int[width * height];int[] alphaPixels = new int[width * height];front.getPixels(frontPixels,0,width,0,0,width,height);background.getPixels(backgroundPixels,0,width,0,0,width,height);alpha.getPixels(alphaPixels,0,width,0,0,width,height);float frontA = 0,frontR = 0,frontG = 0,frontB = 0;float backgroundR = 0,backgroundG = 0,backgroundB = 0;float alphaR = 0,alphaG = 0,alphaB = 0;int index=0;//逐个像素赋值(这种写法比较耗时,后续可以优化)for (int row=0; row < height; row++){for (int col=0; col < width; col++){index = width*row +col;//取出前景图像像素值frontA=(frontPixels[index]>>24)&0xff;frontR=(frontPixels[index]>>16)&0xff;frontG=(frontPixels[index]>>8)&0xff;frontB=frontPixels[index]&0xff;//取出alpha像素值alphaR=(alphaPixels[index]>>16)&0xff;alphaG=(alphaPixels[index]>>8)&0xff;alphaB=alphaPixels[index]&0xff;//取出背景图像像素值backgroundR=(backgroundPixels[index]>>16)&0xff;backgroundG=(backgroundPixels[index]>>8)&0xff;backgroundB=backgroundPixels[index]&0xff;//重新合成  ImgOut = F * alpha/255 + BG * ( 1 - alpha/255 )frontR= frontR*alphaR/255 + backgroundR*(1-alphaR/255);frontG=frontG*alphaG/255 + backgroundG*(1-alphaG/255);frontB=frontB*alphaB/255 + backgroundB*(1-alphaB/255);frontPixels[index]=(int)frontA<<24|((int)frontR<<16)|((int)frontG<<8)|(int)frontB;}}result.setPixels(frontPixels,0,width,0,0,width,height);;return result;}

PC端版本体验:(点击地址,上传 图片体验)

https://sight-x.cn/portrait_matting/

如何使用,参考官网文档,下载sdk配置即可

参考地址:

https://www.paddlepaddle.org.cn/

https://github.com/PaddlePaddle/PaddleSeg

https://github.com/ZHKKKe/MODNet

本人练习案例代码地址:

Android开源的Modnet算法实现抠图和更换背景-Android文档类资源-CSDN下载

Android ------ 开源的Modnet算法实现抠图和更换背景相关推荐

  1. 带你「周游世界」的 MODNet 算法

    来源 | Jack Cui 责编 | 晋兆雨 头图 | CSDN下载自视觉中国 最近又有一个算法火了,不知道你们看到没?直接看效果! 效果这么稳定的人像 Image Matting 算法真的不多,并且 ...

  2. 关于Android开源库分享平台,(GitClub)微信小程序的开发体验

    七八月份的深圳一直在下雨,总有人说雨天适合窝在家看书,对于程序开发者来说更是难得的学习机会.我们502工作室的小伙伴利用这个时间学习了一下微信小程序开发,并上线了一个GitClub小程序,目前功能有些 ...

  3. RetinaFace,最强开源人脸检测算法

    作者 | CV君 来源 | 我爱计算机视觉(ID:aicvmlaicvmlaicvml) 人脸检测为目标检测的特例,是商业化最早的目标检测算法,也是目前几乎各大 CV 方向 AI 公司的必争之地. W ...

  4. Android开源项目分类汇总-转载

    太长了,还是转载吧... 今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源项目分类汇总,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有 ...

  5. Android开源项目分类汇总[转]

    Android开源项目分类汇总 如果你也对开源实现库的实现原理感兴趣,欢迎 Star 和 Fork Android优秀开源项目实现原理解析 欢迎加入 QQ 交流群:383537512(入群理由需要填写 ...

  6. Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍经常使用的开发库,包含依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本号向低版本号 ...

  7. Android开源项目--分类汇总

    为什么80%的码农都做不了架构师?>>>    转自:https://github.com/Trinea/android-open-project Android开源项目第一篇--个 ...

  8. 六款值得推荐的Android开源框架简介

    六款值得推荐的Android开源框架简介 技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的"性价比"比较高的Android开源框架,应该是相对实用的. 1.volley ...

  9. Android开源框架源码鉴赏:LruCache与DiskLruCache

    关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流 ...

  10. android开源2016_出版商的选择:2016年顶级开源书籍

    android开源2016 图书出版商分享了2016年必读的与开源相关的图书发行的精选内容. 没有淀粉新闻 (由Anna Morrow提供) 汽车黑客手册 克雷格·史密斯(Craig Smith) 3 ...

最新文章

  1. pytorch lstm crf 代码理解
  2. 计算机维护方面的知识和技巧,电脑硬件维护常识和方法【图文详解】
  3. input type=range标签用法实例代码
  4. 没有找到borlandmm.dll 报错的解决方法
  5. 第二讲 ODE欧拉数值方法
  6. mysql索引分析_MySQL索引分析和优化
  7. 函授计算机与科学论文,函授计算机科学与技术论文
  8. python PyQt5中文教程☞【第五节】PyQt5事件(Event)和信号(信号槽 Signals slots)
  9. nginx搭建文件服务器脚本,nginx搭建web服务器,配置端口复用
  10. AdaBoost算法源码分析
  11. 每个客户使用Jersey处理的Cookie
  12. java查看蓝牙mac地址_Java如何获取主机的MAC地址?
  13. 职称计算机考试word2003真题,职称计算机考试《Word2003》历年真题回顾(1)
  14. 诺基亚手机: 诺基亚N9将在下月19日开卖 售价4400元
  15. 【Java 常用类】java.util包(5)Date类的常用方法
  16. IDEA配置JavaScript库
  17. segnet和unet区别_SegNet图像分割网络直观详解
  18. 创建oracle数据库实例
  19. Vue验证座机号的同时验证手机号
  20. MATLAB程序系列1_混沌理论

热门文章

  1. 写给一些想创业的和在打工路上的人
  2. 关于计算机病毒的代码,常用的电脑病毒代码
  3. 自然语言处理NLP星空智能对话机器人系列:Facebook StarSpace框架案例数据加载
  4. 联想笔记本电脑键盘灯怎么开启_联想笔记本电脑wifi怎么连接 联想笔记本电脑键盘灯开启方法...
  5. gambit2.4证书免费分享
  6. Tapestry5项目的导入
  7. Go面试:用Go语言实现工厂模式 (Golang经典编程案例)
  8. 语音混响制作matlab,1 语音信号的延时和混响 1)利用Windows下的录音机或其他软件,录制一段自己的 matlab 238万源代码下载- www.pudn.com...
  9. ddos发包php文件,简单防范PHPDDOS对外发UDP包消耗流量
  10. C#下对象与JSON串互相转换