数字图像处理软件-特效–光晕特效(五)
最后更新于:2022-04-01 10:16:57
光晕特效在于凸显一个光圈:
下面是效果图
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-28_56f8ea7b4bd86.jpg)
~~~
/**
* 光晕效果
* @param bmp
* @param x 光晕中心点在bmp中的x坐标
* @param y 光晕中心点在bmp中的y坐标
* @param r 光晕的半径
* @return
*/
public static Bitmap halo(Bitmap bmp, int x, int y, float r)
{
long start = System.currentTimeMillis();
// 高斯矩阵
int[] gauss = new int[] { 1, 2, 1, 2, 4, 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 delta = 18; // 值越小图片会越亮,越大则越暗
int idx = 0;
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;
int distance = (int) (Math.pow(k - x, 2) + Math.pow(i - y, 2));
// 不是中心区域的点做模糊处理
if (distance > r * r)
{
for (int m = -1; m <= 1; m++)
{
for (int n = -1; n <= 1; n++)
{
pixColor = pixels[(i + m) * width + k + n];
pixR = Color.red(pixColor);
pixG = Color.green(pixColor);
pixB = Color.blue(pixColor);
newR = newR + (int) (pixR * gauss[idx]);
newG = newG + (int) (pixG * gauss[idx]);
newB = newB + (int) (pixB * gauss[idx]);
idx++;
}
}
newR /= delta;
newG /= delta;
newB /= delta;
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;
}
~~~
如上所说我们需要对圆做设置:1.圆心的XY。2.圆的半径。
有了这些设定,我们就可以确定圆圈的范围,对园内和圆外做不同的操作,这里我让圆内保持不变,圆外改变
这样就完成了,当然大家可以针对园内做成亮色,把离圆心近的地方做更深程度的亮色,这样就有光线的感觉了
数字图像处理软件-图片特效–浮雕效果(四)
最后更新于:2022-04-01 10:16:55
接上之前的数字图像处理软件系列,其实这个APP很早之前就做完了,主要是模仿了美图秀秀。之前因为太多事而耽误了,现在继续把这系列的博客写完
那么开始正文:
这次要讲的图片特效部分是:浮雕特效
老规矩,话不多说,我们来看效果图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-28_56f8ea7b0723f.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-28_56f8ea7b27d61.jpg)
那么下面就开始讲解:
浮雕的特性我们必须得知道,浮雕不凸显细节但是凸显轮廓,这是浮雕的特性,那么轮廓有哪些特点呢?我个人认为,图片中的事物,他们的轮廓区分,基本可以靠颜色区分,也就是边界的颜色差异,当然这个方法只是可以突出局部的轮廓,但这也足够用了。所以和前几篇一样,我们需要用RGB操作,即比较RGB(凸显边界)
~~~
//浮雕
public static Bitmap img_fudiao(Bitmap bm){
intwidth = bm.getWidth();
int height = bm.getHeight();
Bitmap bmp= Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
int color,color2;
//前一个像素
int pixelsR,pixelsR2;
int pixelsG,pixelsG2;
int pixelsB,pixelsB2;
//当前像素
int[] pixels = new int[width * height];
bm.getPixels(pixels, 0, width, 0, 0, width, height);
for(int i=1;i<width*height;i++)
{
color = pixels[i-1];
//前一个像素
pixelsR = Color.red(color);
pixelsG = Color.green(color);
pixelsB = Color.blue(color);
//当前像素
color2 = pixels[i];
pixelsR2 = Color.red(color2);
pixelsG2 = Color.green(color2);
pixelsB2 = Color.blue(color2);
pixelsR = (pixelsR - pixelsR2 + 127);
pixelsG = (pixelsG - pixelsG2 + 127);
pixelsB = (pixelsB - pixelsB2 + 127);
//均小于等于255
if(pixelsR > 255){
pixelsR = 255;
}
if(pixelsG > 255){
pixelsG = 255;
}
if(pixelsB > 255){
pixelsB = 255;
}
pixels[i] = Color.argb(255, pixelsR, pixelsG, pixelsB);
}
bmp.setPixels(pixels, 0, width, 0, 0, width, height);
return bmp;
}
~~~
在代码中可以看到,每次去相邻两项的RGB,让他们做比较,差异色大的可以基本确定是边界色,也就可以凸显轮廓
最后返回结果。
数字图像处理(三)特效—-锐化
最后更新于: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;
~~~
这样,锐化效果就达到了,虽然效果并不明显,本人还在优化当中。
数字图像处理软件(二)
最后更新于:2022-04-01 10:16:50
这是数字图像处理软件系列的第二篇。
首先来讲解图像特效部分
1、选择本地图片,如下图结果:
底部状态栏有多种特效可以选择,有:怀旧,锐化,火焰,浮雕,柔化,光晕,红外,淡化,灰度等效果
下面我选择两种特效做讲解:
Duang~
效果图如下:
下面来讲解思路:
~~~
long start = System.currentTimeMillis();
int width = bmp.getWidth();
int height = bmp.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
int pixColor = 0;
int pixR = 0;
int pixG = 0;
int pixB = 0;
int newR = 0;
int newG = 0;
int newB = 0;
~~~
//没张图片都可以转化为RGB信息,也就是说对RGB信息修改,意味着对图片的修改,也就是产生的一般特效(特殊的特效更为复杂)。
以下内容为核心处理:
~~~
int[] pixels = new int[width * height];
bmp.getPixels(pixels, 0, width, 0, 0, width, height);
for (int i = 0; i < height; i++)
{
for (int k = 0; k < width; k++)
{
pixColor = pixels[width * i + k];
pixR = Color.red(pixColor);
pixG = Color.green(pixColor);
pixB = Color.blue(pixColor);
newR = (int) (0.393 * pixR + 0.769 * pixG + 0.189 * pixB);
newG = (int) (0.349 * pixR + 0.686 * pixG + 0.168 * pixB);
newB = (int) (0.272 * pixR + 0.534 * pixG + 0.131 * pixB);
int newColor = Color.argb(255, newR > 255 ? 255 : newR, newG > 255 ? 255 : newG, newB > 255 ? 255 : newB);
pixels[width * i + k] = newColor;
}
}
~~~
//对每个像素点取RGB,并修改,修改后替换原来信息。
~~~
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
long end = System.currentTimeMillis();
Log.d("may", "used time="+(end - start));
return bitmap;
~~~
//最后实现,返回位图。
数字图像处理软件(一)
最后更新于:2022-04-01 10:16:48
本人大三学生一枚,自学安卓有三四个月了,去公司实习两个月了,在工作上欠缺一些东西,所以决定开始写博客与各位大牛分享交流学习,写的不好勿喷~
写的不好的地方,请指出,虚心学习。
废话不多说,开始~
模块分为:
图片特效,人脸识别,图像调节,二维码,绘图器,图像相框
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-28_56f8ea79d9112.jpg)
1.效果图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-28_56f8ea7a1e399.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-28_56f8ea7a4cd02.jpg)
至于布局文件什么的,就不多谈了。
(1)。图片特效:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-28_56f8ea7a7f91b.jpg)
下一篇讲讲解实现原理
前言
最后更新于:2022-04-01 10:16:46
> 原文出处:[Android 开源数字图像处理](http://blog.csdn.net/column/details/androidopenimage.html)
作者:[u011669081](http://blog.csdn.net/u011669081)
**本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!**
# Android 开源数字图像处理
> 类似于美图秀秀等软件,设计数学,数字图像处理