理解如何实现Android美颜相机
16lz
2021-01-23
理解如何实现Android美颜相机
- android如何实现美颜相机
- 均值滤波的锐化算法
android如何实现美颜相机
1.用具有保边效果的滤波算法对图像进行模糊处理
2.用肤色检测算法保护非皮肤区域
3.将模糊后的图像和原图进行图像融合
4.对融合后的图像进行锐化处理
对于步骤一,该滤波算法可以选择双边滤波,导向滤波,表面模糊等,只要能保边缘就行,高斯模糊是不行的,色斑逗逗就是在这一步磨掉的哈哈,这一步运算速度将直接影响到最后美颜的效率,这也是可以各显神通的地方。
对于步骤二,第一次听说肤色检测好像很高大上,但是它的算法非常简单,就是根据像素的rgb值去判断而已
对于步骤三,可以采用基于alpha通道的图像融合,这一步的作用是为了增加皮肤的质感,因为第一步一般都把皮肤磨得跟娃娃一样了感觉很假。
对于步骤四,在步骤三处理后,会发现图像还是有点朦胧感,还是第一步的副作用,锐化可以强化边缘,让图像看起来更清晰,关于锐化的算法网上有不同的实现算法
以上来自ALiSir写的美颜demo中的解释。
要去实现美颜相机 , 这个还需要一定的android基础
要掌握CyclicBarrier 线程(demo里面将图片分为5份,让5个线程去处理这5个部分)
均值滤波的锐化算法
public int[] sharpen(int[] src, int[] res, int width, int height, int radius, int k, int startRaw, int endRaw) {
//和数组int[] rwindow = new int[width];int[] gwindow = new int[width];int[] bwindow = new int[width];//窗口面积int filter_win = (radius * 2 + 1);filter_win = filter_win * filter_win;//窗口内的rgb值得和int rsum = 0, bsum = 0, gsum = 0;//新的rgb值int new_r = 0, new_g = 0, new_b = 0;//旧的rgb值int old_r = 0, old_g = 0, old_b = 0, oldP = 0;//窗口平均值int mean_r = 0, mean_g = 0, mean_b = 0;//窗口增加值,和删除值int addp = 0, subp = 0;//初始化window数组for (int y = 0; y < width; y++) { int r_col_sum = 0; int g_col_sum = 0; int b_col_sum = 0; for (int x = -radius; x <= radius; x++) { int inky = edgeHandle(startRaw + x, height); int tmpPixels = src[inky * width + y]; int b = tmpPixels & 0xff; int g = (tmpPixels >> 8) & 0xff; int r = (tmpPixels >> 16) & 0xff; r_col_sum += r; g_col_sum += g; b_col_sum += b; } rwindow[y] = r_col_sum; gwindow[y] = g_col_sum; bwindow[y] = b_col_sum;}
其中根据方差和均值算出新像素
mean_r = rsum / filter_win;
mean_g = gsum / filter_win;
mean_b = bsum / filter_win;
更多相关文章
- Android 视频 美颜SDK对比
- 2019最新Android算法相关面试大全,请查收
- android 日历 农历算法
- Android HMAC_SHA1 算法简单实现
- Android G726语音编解码库+除燥音算法
- 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法(android)
- android NV21裁剪算法
- Android算法面试题(1)