2019独角兽企业重金招聘Python工程师标准>>>
图像滤镜处理的两种方式:RGB点乘运算;GPU的矩阵运算(效率更高)。图片处理中的计算:RGBA~利用自带的方法修改色调,饱和度,亮度来修改图片;矩阵~利用矩阵计算得到新的矩阵修改图片。
几个图像像素数据处理过程中的几个知识点:像素格式,图像拉伸,YUV像素取值范围,色域。
快手、美拍、Instagram、OPPO/ViVO 等。
既然是图像处理,那么滤镜的操作就主要是:卷积、像素映射、坐标映射,反映到具体效果上,就是模糊锐化,覆盖层(贴纸等),RGB曲线调整,旋转缩放扭曲之类的。滤镜本质就是像素点的坐标和颜色的变化。
滤镜原理:ios通过颜色矩阵(ColorMatrix)和坐标变换矩阵(Matrix)可以完美的做出上面的所说的效果。视频滤镜,都是对视频中的图像帧进行操作来改变光影和色彩。
美颜有两步,一个是磨皮,一个是美白,要想正确美颜,所以还需要加上人脸识别技术和皮肤识别技术。
滤镜,图形变换处理核心是拿到纹理对象的rgb做算法处理.
【Android】自动瘦脸与眼睛放大美颜算法(shader)- https://blog.csdn.net/Taily_Duan/article/details/67636041
> 图像滤镜
基本滤镜效果的实现:如果我们用ColorMatrix调整RGB三种颜色的比重,就可以实现诸如单色、黑白的效果。Lomo滤镜效果的实现:改变图像数值+遮罩。滤镜包括遮罩、浮雕、模糊、滤镜、渐变色、离散、透明等,并且实现了PATH的各种特效;
-- 美颜等滤镜功能Demo
Android实现图像处理滤镜功能特效实现(资源下载)- http://download.csdn.net/detail/jasonez/8788931
[图片处理] 99种滤镜效果 ImageFilterForAndroid-master- http://download.csdn.net/download/cleopard/8454813
ImageFilterForAndroid图像渲染- http://download.csdn.net/detail/heng615975867/6593591
图像处理滤镜/美化ImageFilterForAndroid- https://github.com/daizhenjun/ImageFilterForAndroid
android 图像处理滤镜系列合集- http://blog.csdn.net/jingwen3699/article/details/7770287
Android实战经验之图像处理及特效处理的集锦(总结版)- https://www.oschina.net/question/231733_44154
Android图片各种处理效果源码- http://download.csdn.net/download/lilidejing/7927579
sangmingming/android-instagram-filter-- https://github.com/sangmingming/android-instagram-filter
imrunning/android-instagram-image-filter-- https://github.com/imrunning/android-instagram-image-filter
Instagram中最初的不到20个滤镜的代码与资源(InstagramFilters)- http://download.csdn.net/detail/oshunz/9335481
ImageFilterForAndroid-master- http://download.csdn.net/detail/cleopard/8454813
如何制作摄影类 app 中的滤镜- https://www.zhihu.com/question/20073281
如何制作摄影类 app 中的滤镜?- https://github.com/YuAo/YUCIHighPassSkinSmoothing
-- [Android] 图像各种处理系列文章合集- http://blog.csdn.net/eastmount/article/details/40689397
Android实战经验之图像处理及特效处理的集锦(总结版)- https://www.oschina.net/question/231733_44154
实时美颜滤镜(ColorMatrix)- https://github.com/Guikunzhi/BeautifyFaceDemo
实时美颜滤镜(ColorMatrix)- https://github.com/BradLarson/GPUImage
Android视频编辑器,给本地视频加水印和美颜滤镜- http://blog.csdn.net/qqchenjian318/article/details/78274901
图像滤镜处理算法:灰度、黑白、底片、浮雕 - http://www.icodelogic.com/?p=575
This is a sobel filter on Android using OpenCL to accelerate.OPenCV,在Android上还实现了很多种并行化的算法,比如SHA-1、HDR、K-means、NL-means、SRAD等- https://github.com/WhiteIsClosing/Android-OpenCL-Sobel-Filter
Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索-http://blog.csdn.net/martin20150405/article/details/54766660
Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索-http://blog.csdn.net/Martin20150405/article/category/6274984
照片美妆---天天P图疯狂变脸特效算法研究- http://blog.csdn.net/trent1985/article/details/71446860
图像算法---磨皮算法研究汇总- http://blog.csdn.net/trent1985/article/details/50496969
人像美妆---妆容迁移算法研究(Makeup transfer)- http://blog.csdn.net/trent1985/article/details/70226779
图像处理(二十一)基于数据驱动的人脸卡通动画生成-Siggraph Asia 2014- http://blog.csdn.net/hjimce/article/details/47083321
-- 图像处理滤镜的话主要处理图片的三原色,并根据三原色进行运算。
android 图像处理滤镜系列合集-- http://blog.csdn.net/jingwen3699/article/details/7770287
图像滤镜艺术- http://blog.csdn.net/Trent1985/article/category/2644207
opencv,图像处理的第三方库很多。
数字图像处理研究- http://blog.csdn.net/Trent1985/article/category/1850555
图像处理,图像分割,特征提取,机器学习,模式识别,深度学习等- http://blog.csdn.net/real_myth?viewmode=contents
OpenGL实践- http://blog.csdn.net/wangkuifeng0118/article/category/1115152
OpenCV 3.1.0编译与添加扩展模块- http://blog.csdn.net/jia20003/article/details/54583431
ImageMagik处理图片的功能很强大 vs PhotoShop。ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、PNG等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。
-- GPUImage 图像处理和实时滤镜
美丽的滤镜背后都是数学和艺术在支撑。相片磨皮;基于GPU的图像处理和实时滤镜,鼎鼎大名的GPUImage
gpuimage滤镜- https://github.com/CyberAgent/android-gpuimage
GPUImage的项目结构其实很简单,android版本就更是简陋,结构如下:
1.一堆滤镜(shader以及配套设置参数的代码);
2.FilterGroup(利用FBO进行同一副图像的多次处理);
3.EGL管理类(主要用来做离屏渲染);
虽然GPUImage的主要价值在那堆滤镜上,但是我们主要来分析后面两个,这是GPUImage的框架,而滤镜就像插件一样,想插就插:D,我们也可以依葫芦画瓢定制自己的滤镜。
GPUImage是采用链式方法来处理画面,通过addTarget方法添加对象到链中,处理完一个target,就会吧上一个环节处理好的图像数据传递到下一个target处理,成为GPUImage处理链。
GPU工作原理:CPU指定显示器工作,显示控制器根据CPU的控制到指定的地方去取数据和指令,目前的数据一般是从显存里取,如果显存里存不下,则从内存里取,内存也放不下,则从硬盘里取。
滤镜处理的原理:就是把静态图片或者视频的每一帧进行图形变化后在显示到屏幕上,其本质就是像素点的坐标和颜色的变化。
一个视频通信的基础架构可能涉及到采集(音视频采集)、前处理(例如噪声处理、人脸识别等)、音视频编解码、流媒体协议、系统架构(如数据库、文件系统)、CDN、播放控制(如音视频同步)和交互技术等。MediaCodec,MediaMuxer,MediaFormat等.
-- 滤镜在色彩处理中,通常使用以下三个角度来描述一个图像:
色调——物体传播的颜色;饱和度——颜色的纯度,从0(灰)到100%(饱和)来进行描述;亮度——颜色的相对明暗程度;在Android 的 ColorMatrix 颜色矩阵中也封装了一些 API 来快速调整上面这三个颜色参数,而不用每次都去计算矩阵的值。
-- 美颜的实现的步骤是:https://www.2cto.com/kf/201604/498289.html
1.用具有保边效果的滤波算法对图像进行模糊处理;
2.用肤色检测算法保护非皮肤区域;
3.将模糊后的图像和原图进行图像融合;
4.对融合后的图像进行锐化处理;
- 美颜和滤镜
一般的思路是磨破+美白,即用类似双边滤波这样的边缘保持滤波器对肤色区域做平滑处理,然后做肤色的色调调节.
根据RGB值识别皮肤部分,进行肤色调整,用具有保持边缘效果的滤波算法对图像进行模糊处理,用一些算法将模糊后的图像与原图进行融合,增加皮肤质感,此时的图片会有一些朦胧感,锐化可以强化边缘,让图像更加清晰。
自动瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文- http://www.gson.org/thesis/warping-thesis.pdf.
在1979年Lee发表的论文《Lee Filter Digital Image Enhancement and Noise Filtering by Use of Local Statistics》中,提出了基于局部信息去除加性噪音、乘性噪音及加性乘性混合噪音的方法,经过仔细的学习和编码,发现其去除加性噪音的方法效果非常好,具有现在一些EPF算法类似的边缘保留功能,并且其运算并不复杂,可以应用到类似于磨皮这种项目中。http://imagej.net/Integral_Image_Filters. 皮肤识别有很多算法.
- 美白算法: 借用色彩平衡算法;使用logarithmic Curve;使用图层混合.。对人脸进行美白、磨皮、瘦脸和大眼等美化功能;磨皮算法 实时滤镜。
Smooth:皮肤平滑度,越高皮肤除;
Skin Color:皮肤.色,low为做红.处理;
Sharp:瘦脸&大眼程度,值越高表示程度越大。
-- OpenGL ES程序处理图片的步骤:
1.初始化OpenGL ES 环境,编译、链接顶点着色器和片元着色器。
2.缓存顶点、纹理坐标数据,传送图像数据到GPU
3.绘制图元到特定的帧缓存;
4.在帧缓存去除绘制的图像。
> 图像处理,图像像素处理,图像处理技术
【数字图像处理的基本原理和常用方法】- https://blog.csdn.net/xCnhYKoHj3eK/article/details/80103618
图形和图像信息。数字图像处理作为一门学科大约形成于 20 世纪 60 年代初期。早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。图像处理中,输入的是质量低的图像,输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩、图像分类(识别)、图像变换等。
图像处理技术在娱乐中的应用主要包括:电影特效制作、电脑电子游戏、数码相机、视频播放、数字电视等。
Android对于图片的处理,最常使用到的数据结构是位图——Bitmap,它包含了一张图片所有的数据。整个图片都是由点阵和颜色值组成的,所谓点阵就是一个包含像素的矩阵,每一个元素对应着图片的一个像素。而颜色值—ARGB,分别对应着透明度、红、绿、蓝这四个通道分量,他们共同决定了每个像素点显示的颜色。上图显示的就是色光三原色。
-- 像素处理getPixel getPixels setPixel setPixels
Android Bitmap 加载与像素操作- https://blog.csdn.net/jia20003/article/details/46723903
Android图像处理整理- http://blog.csdn.net/luzhenyuxfcy/article/details/49427781
-- 开源图像库Skia: Skia 是完整的2D图像库,Google 一个底层的图形、图像、动画、 SVG 、文本/RGB(8byte – 32byte)编码(jpeg, png) 和解码功能等多方面的图形库,是 android 中图形系统的引擎。
Android图片解码流程:
1) APP:BitmapDecode.Java
2) API:BitmapFactory.java(static image)、Movie.java(dynamic image)
3) JNI:BitmapFactory.cpp(static image)、Movie.cpp(dynamic image)
4) C Native Service(Skia):SkImageDecoder.cpp(static image)、SkMovie.cpp(dynamic image)
skia 源码解析 http://www.eoeandroid.com/thread-27841-1-1.html .libskia
使用系统自带libjpeg时问题 http://stackoverflow.com/questions/5208817/failing-to-link-against-libjpeg-so-in-jni-ndk-shared-library .libjpeg是个跨平台的开源库.
Skia主要使用的第三方库:Zlib、Jpeglib、Pnglib、giflib、fpdfemb(处理pdf文档);
Skia编译及调用 Android? Skia调用OpenGL或OpenGL ES?
--图片绘制,PorterDuffXfermode,这是CoorChice-https://github.com/chenBingX/CoorChiceLibOne/blob/448cf36e0b33fb667cb4fd5a8d8db2651bf0647e/app/src/main/java/com/chenbing/coorchicelibone/Views/PorterDuffXDemoActivity.java
YUV是被欧洲电视系统索采用的一种颜色编码方法。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像,彩色电视采用YUV空间正式为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽。
-- 贴图
android ndk调用OpenGL 实现纹理贴图Texture- http://blog.csdn.net/chrisfxs/article/details/34359265
android ndk调用OpenGL 实现纹理贴图Texture- http://download.csdn.NET/detail/chrisfxs/7547637
-- 图片分片,拼图游戏可以用到
【Android图像处理】将一张图片切成许多碎片- http://blog.csdn.net/qq_32353771/article/details/53215322
[Android] Android中将一个图片切割成多个图片- http://blog.csdn.net/arui319/article/details/7470193
-- android拼接多张bitmap图片- http://blog.csdn.net/ajun495175289/article/details/18091683
/**
* 横向拼接
* <功能详细描述>
* @param first
* @param second
* @return
*/
private Bitmap add2Bitmap(Bitmap first, Bitmap second) {
int width = first.getWidth() + second.getWidth();
int height = Math.max(first.getHeight(), second.getHeight());
Bitmap result = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(first, 0, 0, null);
canvas.drawBitmap(second, first.getWidth(), 0, null);
return result;
}
/**
* 纵向拼接
* <功能详细描述>
* @param first
* @param second
* @return
*/
private Bitmap addBitmap(Bitmap first, Bitmap second) {
int width = Math.max(first.getWidth(),second.getWidth());
int height = first.getHeight() + second.getHeight();
Bitmap result = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(first, 0, 0, null);
canvas.drawBitmap(second, first.getHeight(), 0, null);
return result;
}
-- 图片倒影,其原理基本上就是将原图倒置,画在画布上,然后加上一个半透明的蒙版
public static Bitmap createReflectedImage(Bitmap originalImage) {
int width = originalImage.getWidth();
int height = originalImage.getHeight();
Matrix matrix = new Matrix();
// 实现图片翻转90度
matrix.preScale(1, -1);
// 创建倒影图片(是原始图片的一半大小)
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height / 2, width, height / 2, matrix, false);
// 创建总图片(原图片 + 倒影图片)
Bitmap finalReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888);
// 创建画布
Canvas canvas = new Canvas(finalReflection);
canvas.drawBitmap(originalImage, 0, 0, null);
//把倒影图片画到画布上
canvas.drawBitmap(reflectionImage, 0, height + 1, null);
Paint shaderPaint = new Paint();
//创建线性渐变LinearGradient对象
LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, finalReflection.getHeight() + 1, 0x70ffffff,
0x00ffffff, TileMode.MIRROR);
shaderPaint.setShader(shader);
shaderPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
//画布画出反转图片大小区域,然后把渐变效果加到其中,就出现了图片的倒影效果。
canvas.drawRect(0, height + 1, width, finalReflection.getHeight(), shaderPaint);
return finalReflection;
}
-- 图片阴影,在一个圆角矩形的图片四周加上阴影效果,在原图四边加上矩形的阴影,然后在四个圆角的地方画扇形阴影来实现。
Android图片添加阴影效果的两种方式- http://blog.csdn.net/u011421608/article/details/51923812
public static Bitmap createShadowBitmap(Bitmap orignalBitmap,
int shadowMargin, int iconCornerRadius) {
int w = orignalBitmap.getWidth();
int h = orignalBitmap.getHeight();
Bitmap shadowBitmap = Bitmap.createBitmap(w + shadowMargin * 2, h
+ shadowMargin * 2, Config.ARGB_8888);
int width = shadowBitmap.getWidth();
int height = shadowBitmap.getHeight();
Canvas canvas = new Canvas(shadowBitmap);
canvas.drawBitmap(orignalBitmap, shadowMargin, shadowMargin, null);
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(Mode.DST_OVER));
int radius = shadowMargin + iconCornerRadius;
// 四个边的阴影效果,采用线性阴影,宽度等于阴影边距+圆角半径
LinearGradient leftGradient = new LinearGradient(radius, 0, 0, 0,
0x7F000000, 0x00000000, TileMode.CLAMP);
LinearGradient rightGradient = new LinearGradient(width - radius, 0,
width, 0, 0x7F000000, 0x00000000, TileMode.CLAMP);
LinearGradient topGradient = new LinearGradient(0, radius, 0, 0,
0x7F000000, 0x00000000, TileMode.CLAMP);
LinearGradient bottomGradient = new LinearGradient(0, height - radius,
0, height, 0x7F000000, 0x00000000, TileMode.CLAMP);
paint.setShader(leftGradient);
canvas.drawRect(0, radius, radius, height - radius, paint);
paint.setShader(rightGradient);
canvas.drawRect(width - radius, radius, width, height - radius, paint);
paint.setShader(topGradient);
canvas.drawRect(radius, 0, width - radius, radius, paint);
paint.setShader(bottomGradient);
canvas.drawRect(radius, height - radius, width - radius, height, paint);
// 四个角的阴影效果,采用圆形阴影,半径等于阴影边距+圆角半径
RadialGradient topLeftCornerGradient = new RadialGradient(radius,
radius, radius, 0x7F000000, 0x00000000, TileMode.CLAMP);
RadialGradient topRightCornerGradient = new RadialGradient(width
- radius, radius, radius, 0x7F000000, 0x00000000,
TileMode.CLAMP);
RadialGradient bottomLeftCornerGradient = new RadialGradient(radius,
height - radius, radius, 0x7F000000, 0x00000000, TileMode.CLAMP);
RadialGradient bottomRightCornerGradient = new RadialGradient(width
- radius, height - radius, radius, 0x7F000000, 0x00000000,
TileMode.CLAMP);
// 画四个角,就是画四个圆心角为90度的扇形,drawArc函数第一个参数为圆弧所在圆的的外接矩形,第二个参数为起始角度,第三个参数为扇形顺时针滑过的角度,第四个参数如果为true时,在绘制圆弧时将圆心包括在内(用来画扇形),第五个参数为画笔
paint.setShader(topLeftCornerGradient);
canvas.drawArc(new RectF(0, 0, radius * 2, radius * 2), 180, 90, true,
paint);
paint.setShader(topRightCornerGradient);
canvas.drawArc(new RectF(width - radius * 2, 0, width, radius * 2),
270, 90, true, paint);
paint.setShader(bottomLeftCornerGradient);
canvas.drawArc(new RectF(0, height - radius * 2, radius * 2, height),
90, 90, true, paint);
paint.setShader(bottomRightCornerGradient);
canvas.drawArc(new RectF(width - radius * 2, height - radius * 2,
width, height), 0, 90, true, paint);
return shadowBitmap;
}