算法原理:
一、简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的和的平均数,再乘以相应的系数,然后在与当前像素点之和。
例:
常见的锐化矩阵有:
图像某像素点E,周围的像素A,B,C,D,F,G,H,I
A B C
D E F
G H I
如选取矩阵
int[] laplacian = new int[]{-1, -1, -1, -1, 9, -1, -1, -1, -1};
对E点进行锐化:
E.r = (9*E.r - (A.r + B.r + C.r + D.r + F.r + G.r + H.r + I.r));
二、拉普拉斯变换:将拉普拉斯矩阵中的项与相应点的RGB值之积再乘以相应的系数的和作为当前点的RGB值。
例:用上面的例子,还是对E点进行锐化。
/**
* 图片锐化(拉普拉斯变换)
*
* @return
*/
private Bitmap sharpenImageAmeliorate(Bitmap bmp)
{
long start = System.currentTimeMillis();
// 拉普拉斯矩阵
int[] laplacian = new int[]{-1, -1, -1, -1, 9, -1, -1, -1, -1};
// int[] laplacian = new int[]{0, -1, 0, -1, 5, -1, 0, -1, 0};
// int[] laplacian = new int[]{1, -2, 1, -2, 5, -2, 1, -2, 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 = 1F;
//原图像素点数组
int[] pixels = new int[width*height];
//创建一个新数据保存锐化后的像素点
int[] pixels_1 = 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_1[i*width+k] = Color.argb(255, newR, newG, newB);
newR = 0;
newG = 0;
newB = 0;
}
}
bitmap.setPixels(pixels_1, 0, width, 0, 0, width, height);
long end = System.currentTimeMillis();
Log.d("may", "used time="+( end-start ));
return bitmap;
}
原图:
锐化后: