算法原理:
一、简单算法:分别获取当前像素点和八个周围像素点的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; }
原图:
锐化后:
其他锐化效果就不贴出来啦,参考这个例子就好。