数字图像处理(三)特效—-锐化
最后更新于:2022-04-01 10:16:53
关于锐化效果,感觉效果并没有达到预期的效果。
处理后感觉像素变的粗糙了。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-28_56f8ea7abfc72.jpg)
这涉及到数学知识,是关于拉普拉斯矩阵的应用,而本人在数学方面并不牛,所以不敢在这细讲,怕误导大家。
~~~
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;
~~~
这样,锐化效果就达到了,虽然效果并不明显,本人还在优化当中。