您的位置:首页 > 移动开发 > Android开发

android 图片特效处理之锐化效果

2017-04-17 13:56 579 查看
这篇将讲到图片特效处理的锐化效果。跟前面一样是对像素点进行处理,算法是通用的。

算法原理:

一、简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的和的平均数,再乘以相应的系数,然后在与当前像素点之和。

例:

ABC

DEF

GHI

对E点进行锐化:

[java]
view plaincopy

float delta = 0.3;

E.r = (E.r - (A.r + B.r + C.r + D.r + F.r + G.r + H.r + I.r) /
8) * delta + E.r;

[java] view plain copy

float delta = 0.3;

E.r = (E.r - (A.r + B.r + C.r + D.r + F.r + G.r + H.r + I.r) / 8) * delta + E.r;

E.g,E.b类似,delta建议取0.3,具体多少无所谓,试一下就知道了。但按照上面原理,没有达到预期的效果,改变delta的值也不行,所以后面代码就不贴出来了,感兴趣的可以研究一下。

二、拉普拉斯变换:将拉普拉斯矩阵中的项与相应点的RGB值之积再乘以相应的系数的和作为当前点的RGB值。

例:用上面的例子,还是对E点进行锐化。

[java]
view plaincopy

// 拉普拉斯矩阵

int[] laplacian = new
int[] { -1, -1, -1, -1,
9, -1, -1, -1, -1 };

float delta = 0.3;

E.r = A.r * laplacian[0] * delta + B.r * laplacian[1] * delta + C.r * laplacian[2] * delta + D.r * laplacian[3]
* delta + E.r * laplacian[4] * delta + F.r * laplacian[5] * delta + G.r * laplacian[6] * delta + H.r * laplacian[7]
* delta + I.r * laplacian[8] * delta;

// E.g和E.b值类似

[java] view plain copy

// 拉普拉斯矩阵

int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 };

float delta = 0.3;

E.r = A.r * laplacian[0] * delta + B.r * laplacian[1] * delta + C.r * laplacian[2] * delta + D.r * laplacian[3] * delta + E.r * laplacian[4] * delta + F.r * laplacian[5] * delta + G.r * laplacian[6] * delta + H.r * laplacian[7] * delta + I.r * laplacian[8] * delta;

// E.g和E.b值类似

下面看效果图:
原图:



处理后:



貌似处理有点问题,中间会看到很多的竖线,很明显,可能是没有优化好,因为采用了getPiexels() 和setPixels()方法,所以一维数组的对应图片的宽高有点麻烦。

下面贴代码,仅供参数,同样注意图片的大小,数组大小不能超过虚拟机规定值。

[java] view plain copy

/**

* 图片锐化(拉普拉斯变换)

* @param bmp

* @return

*/

private Bitmap sharpenImageAmeliorate(Bitmap bmp)

{

long start = System.currentTimeMillis();

// 拉普拉斯矩阵

int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 };

int width = bmp.getWidth();

int height = bmp.getHeight();

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);

int pixR = 0;

int pixG = 0;

int pixB = 0;

int pixColor = 0;

int newR = 0;

int newG = 0;

int newB = 0;

int idx = 0;

float alpha = 0.3F;

int[] pixels = new int[width * height];

bmp.getPixels(pixels, 0, width, 0, 0, width, height);

for (int i = 1, length = height - 1; i < length; i++)

{

for (int k = 1, len = width - 1; k < len; k++)

{

idx = 0;

for (int m = -1; m <= 1; m++)

{

for (int n = -1; n <= 1; n++)

{

pixColor = pixels[(i + n) * width + k + m];

pixR = Color.red(pixColor);

pixG = Color.green(pixColor);

pixB = Color.blue(pixColor);

newR = newR + (int) (pixR * laplacian[idx] * alpha);

newG = newG + (int) (pixG * laplacian[idx] * alpha);

newB = newB + (int) (pixB * laplacian[idx] * alpha);

idx++;

}

}

newR = Math.min(255, Math.max(0, newR));

newG = Math.min(255, Math.max(0, newG));

newB = Math.min(255, Math.max(0, newB));

pixels[i * width + k] = Color.argb(255, newR, newG, newB);

newR = 0;

newG = 0;

newB = 0;

}

}

bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

long end = System.currentTimeMillis();

Log.d("may", "used time="+(end - start));

return bitmap;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: