牛骨文教育服务平台(让学习变的简单)

关于锐化效果,感觉效果并没有达到预期的效果。

处理后感觉像素变的粗糙了。

这涉及到数学知识,是关于拉普拉斯矩阵的应用,而本人在数学方面并不牛,所以不敢在这细讲,怕误导大家。

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);

//同样,和上一篇一样,对像素点的RGB做处理

不过这里要用上拉普拉斯矩阵,做信息修改。

以下是对像素的详细操作核心:

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;  

这样,锐化效果就达到了,虽然效果并不明显,本人还在优化当中。