图像滤镜处理的两种方式:RGB点乘运算;GPU的矩阵运算(效率更高)。图片处理中的计算:RGBA~利用自带的方法修改色调,饱和度,亮度来修改图片;矩阵~利用矩阵计算获得新的矩阵修改图片。html
几个图像像素数据处理过程当中的几个知识点:像素格式,图像拉伸,YUV像素取值范围,色域。java
快手、美拍、Instagram、OPPO/ViVO 等。
既然是图像处理,那么滤镜的操做就主要是:卷积、像素映射、坐标映射,反映到具体效果上,就是模糊锐化,覆盖层(贴纸等),RGB曲线调整,旋转缩放扭曲之类的。滤镜本质就是像素点的坐标和颜色的变化。
滤镜原理:ios经过颜色矩阵(ColorMatrix)和坐标变换矩阵(Matrix)能够完美的作出上面的所说的效果。视频滤镜,都是对视频中的图像帧进行操做来改变光影和色彩。android
美颜有两步,一个是磨皮,一个是美白,要想正确美颜,因此还须要加上人脸识别技术和皮肤识别技术。ios
滤镜,图形变换处理核心是拿到纹理对象的rgb作算法处理.git
【Android】自动瘦脸与眼睛放大美颜算法(shader)- https://blog.csdn.net/Taily_Duan/article/details/67636041github
> 图像滤镜
基本滤镜效果的实现:若是咱们用ColorMatrix调整RGB三种颜色的比重,就能够实现诸如单色、黑白的效果。Lomo滤镜效果的实现:改变图像数值+遮罩。滤镜包括遮罩、浮雕、模糊、滤镜、渐变色、离散、透明等,而且实现了PATH的各类特效;web
-- 美颜等滤镜功能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-一、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; }