Android ------ 开源的Modnet算法实现抠图和更换背景
最近在研究图像出来这一块,网上查的比较多,试过基础的opencv 的抠图,效果不是很理想
opencv抠图参考
https://blog.csdn.net/u010302327/article/details/78898781
https://blog.csdn.net/hardWork_yulu/article/details/78757665
试了很多,最终找到一个还不错哦的,基本能完成自己想要的效果,那就是这个开源的modnet算法,基于PaddleSeg的MODNet算法实现人像抠图,但是一些复杂的图片还是不行,也花了很多时间,所以来分析一哈。
分享案例可以选择相册或者直接拍照体验哈
先来看看效果图:(可以替换成自己想要的背景图片)
功能:
- 在人像抠图Demo中,默认会载入一张人像图像,并会在图像下方给出CPU的预测结果和预测时延;
- 在人像抠图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算法实现抠图和更换背景相关推荐
- 带你「周游世界」的 MODNet 算法
来源 | Jack Cui 责编 | 晋兆雨 头图 | CSDN下载自视觉中国 最近又有一个算法火了,不知道你们看到没?直接看效果! 效果这么稳定的人像 Image Matting 算法真的不多,并且 ...
- 关于Android开源库分享平台,(GitClub)微信小程序的开发体验
七八月份的深圳一直在下雨,总有人说雨天适合窝在家看书,对于程序开发者来说更是难得的学习机会.我们502工作室的小伙伴利用这个时间学习了一下微信小程序开发,并上线了一个GitClub小程序,目前功能有些 ...
- RetinaFace,最强开源人脸检测算法
作者 | CV君 来源 | 我爱计算机视觉(ID:aicvmlaicvmlaicvml) 人脸检测为目标检测的特例,是商业化最早的目标检测算法,也是目前几乎各大 CV 方向 AI 公司的必争之地. W ...
- Android开源项目分类汇总-转载
太长了,还是转载吧... 今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源项目分类汇总,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有 ...
- Android开源项目分类汇总[转]
Android开源项目分类汇总 如果你也对开源实现库的实现原理感兴趣,欢迎 Star 和 Fork Android优秀开源项目实现原理解析 欢迎加入 QQ 交流群:383537512(入群理由需要填写 ...
- Android开源项目第二篇——工具库篇
本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍经常使用的开发库,包含依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本号向低版本号 ...
- Android开源项目--分类汇总
为什么80%的码农都做不了架构师?>>> 转自:https://github.com/Trinea/android-open-project Android开源项目第一篇--个 ...
- 六款值得推荐的Android开源框架简介
六款值得推荐的Android开源框架简介 技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的"性价比"比较高的Android开源框架,应该是相对实用的. 1.volley ...
- Android开源框架源码鉴赏:LruCache与DiskLruCache
关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流 ...
- android开源2016_出版商的选择:2016年顶级开源书籍
android开源2016 图书出版商分享了2016年必读的与开源相关的图书发行的精选内容. 没有淀粉新闻 (由Anna Morrow提供) 汽车黑客手册 克雷格·史密斯(Craig Smith) 3 ...
最新文章
- pytorch lstm crf 代码理解
- 计算机维护方面的知识和技巧,电脑硬件维护常识和方法【图文详解】
- input type=range标签用法实例代码
- 没有找到borlandmm.dll 报错的解决方法
- 第二讲 ODE欧拉数值方法
- mysql索引分析_MySQL索引分析和优化
- 函授计算机与科学论文,函授计算机科学与技术论文
- python PyQt5中文教程☞【第五节】PyQt5事件(Event)和信号(信号槽 Signals slots)
- nginx搭建文件服务器脚本,nginx搭建web服务器,配置端口复用
- AdaBoost算法源码分析
- 每个客户使用Jersey处理的Cookie
- java查看蓝牙mac地址_Java如何获取主机的MAC地址?
- 职称计算机考试word2003真题,职称计算机考试《Word2003》历年真题回顾(1)
- 诺基亚手机: 诺基亚N9将在下月19日开卖 售价4400元
- 【Java 常用类】java.util包(5)Date类的常用方法
- IDEA配置JavaScript库
- segnet和unet区别_SegNet图像分割网络直观详解
- 创建oracle数据库实例
- Vue验证座机号的同时验证手机号
- MATLAB程序系列1_混沌理论
热门文章
- 写给一些想创业的和在打工路上的人
- 关于计算机病毒的代码,常用的电脑病毒代码
- 自然语言处理NLP星空智能对话机器人系列:Facebook StarSpace框架案例数据加载
- 联想笔记本电脑键盘灯怎么开启_联想笔记本电脑wifi怎么连接 联想笔记本电脑键盘灯开启方法...
- gambit2.4证书免费分享
- Tapestry5项目的导入
- Go面试:用Go语言实现工厂模式 (Golang经典编程案例)
- 语音混响制作matlab,1 语音信号的延时和混响
1)利用Windows下的录音机或其他软件,录制一段自己的 matlab 238万源代码下载- www.pudn.com...
- ddos发包php文件,简单防范PHPDDOS对外发UDP包消耗流量
- C#下对象与JSON串互相转换