理解如何实现Android美颜相机

理解如何实现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;

你可能感兴趣的:(美颜相机基本原理)