Android 修图(换证件照背景,污点修复)

您所在的位置:网站首页 醒图更换证件照背景颜色 Android 修图(换证件照背景,污点修复)

Android 修图(换证件照背景,污点修复)

2024-07-05 05:59| 来源: 网络整理| 查看: 265

背景

前段时间的一个周末,一个女生让我帮她换一下他的证件照背景,我又没带电脑。我又不好意思拒接,怎么办呢?应用商店下载一个证件照换背景的APP,瞬间换完,我正准备保存时,跳出来一个支付框,如果你要保存,支付2元钱,出于面子,我只好掏了2块钱,保存了。于是我就想,这种技术活,还给别人付钱,自己来撸吧.我是一个专职Android开发,那么就用Android来撸吧.

先来了解一下Android里原生API对图片操作,一般有两种方式,

一种是利用好Canvas绘制图片,一种是利用Bitmap的原生API,获取像素进行操作

这两种操作我都写了对应的文章,可以快速查看

Android:让你的“女神”逆袭,代码撸彩妆(画妆)Android:代码撸彩妆 2(大眼,瘦脸,大长腿)

今天的主题是在Android里使用OpenCv来操作图片,并实现两个不同的效果,换证件照背景和污点修复.

代码已经托管在Github上,和上两篇文章代码地址一样,分支with-photo-changecolor

Github ,如果你喜欢,欢迎star 谢谢

Android OpenCv 快速入门 环境搭建

原生的API对图片的操作有限,并且一些颜色空间转化麻烦,效率低,那我们使用一个专业的图片操作库来操作图片,会变得容易些.

OpenCv有很多语言版本,当然底层是c/c++,他支持Android/IOS,Windows,Mac等,我们直接选择Android版本. 那么来搭建一下环境,有两部

下载OpenCv SDK 地址,将SDK 打包成aar,集成到项目中,快速获取aar,可以直接到我打好的包里获取 Github中获取. 打aar包很简单,用Android Studio打开下载好的SDK,然后到其目录下,执行./gradlew assembleRelease 或者用侧边的辅助工具 集成到你要使用OpenCv的项目,如下

图像灰度测试

集成完成后,进行OpenCV SDK接入成功测试

private void initLoaderOpenCV() { boolean success = OpenCVLoader.initDebug(); if (!success) { Log.d(TAG, "初始化失败"); } } public void gray(View view) { Mat src = new Mat(); Mat dst = new Mat(); Utils.bitmapToMat(bitmap, src); Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGRA2GRAY); Bitmap resultBitmap = getResultBitmap(); Utils.matToBitmap(dst, resultBitmap); src.release(); dst.release(); showCompare(resultBitmap); }

如果接入没问题,就可以愉快的使用OpenCV了,是不是很简单.

换证件照背景 (从蓝色到红色)

换证件照算法,直接使用了一个c++ 版本算法的,翻译为Android的. c++文章地址

主要步骤:

把RGB图像转换到HSV空间取背景的一小块20*20,计算蓝色背景的平均色调和饱和度设置阈值,取出蓝色背景替换为红色背景把HSV图像转换会RGB空间滤波器去除边缘效应

Android 代码如下:

private void startDetail() { Mat image = new Mat(); Utils.bitmapToMat(bitmap, image); Mat hsvImg = new Mat(); Imgproc.cvtColor(image, hsvImg, Imgproc.COLOR_BGR2HSV); List list = new ArrayList(); Core.split(hsvImg, list); Mat roiH = list.get(0).submat(new Rect(0, 0, 20, 20)); Mat roiS = list.get(1).submat(new Rect(0, 0, 20, 20)); Log.i(TAG,"start sum bg"); int SumH = 0; int SumS = 0; byte[] h = new byte[1]; byte[] s = new byte[1]; //取一块蓝色背景,计算出它的平均色调和平均饱和度 for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3