网上找了很多,没有一个能用的,本文的方法是自己在别人的基础上修改而来,纯Java算法,效率没有C++的高,追求效率的可以用Jni,具体参考:http://vaero.blog.51cto.com/4350852/822997
感谢网上分享的朋友们!
有图有真相:
接下来直接上代码:
public void binarization(Bitmap img) {
width = img.getWidth();
height = img.getHeight();
int area = width * height;
int gray[][] = new int[width][height];
int average = 0;// 灰度平均值
int graysum = 0;
int graymean = 0;
int grayfrontmean = 0;
int graybackmean = 0;
int pixelGray;
int front = 0;
int back = 0;
int[] pix = new int[width * height];
img.getPixels(pix, 0, width, 0, 0, width, height);
for (int i = 1; i < width; i++) { // 不算边界行和列,为避免越界
for (int j = 1; j < height; j++) {
int x = j * width + i;
int r = (pix[x] >> 16) & 0xff;
int g = (pix[x] >> 8) & 0xff;
int b = pix[x] & 0xff;
pixelGray = (int) (0.3 * r + 0.59 * g + 0.11 * b);// 计算每个坐标点的灰度
gray[i][j] = (pixelGray << 16) + (pixelGray << 8) + (pixelGray);
graysum += pixelGray;
}
}
graymean = (int) (graysum / area);// 整个图的灰度平均值
average = graymean;
Log.i(TAG,"Average:"+average);
for (int i = 0; i < width; i++) // 计算整个图的二值化阈值
{
for (int j = 0; j < height; j++) {
if (((gray[i][j]) & (0x0000ff)) < graymean) {
graybackmean += ((gray[i][j]) & (0x0000ff));
back++;
} else {
grayfrontmean += ((gray[i][j]) & (0x0000ff));
front++;
}
}
}
int frontvalue = (int) (grayfrontmean / front);// 前景中心
int backvalue = (int) (graybackmean / back);// 背景中心
float G[] = new float[frontvalue - backvalue + 1];// 方差数组
int s = 0;
Log.i(TAG,"Front:"+front+"**Frontvalue:"+frontvalue+"**Backvalue:"+backvalue);
for (int i1 = backvalue; i1 < frontvalue + 1; i1++)// 以前景中心和背景中心为区间采用大津法算法(OTSU算法)
{
back = 0;
front = 0;
grayfrontmean = 0;
graybackmean = 0;
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (((gray[i][j]) & (0x0000ff)) < (i1 + 1)) {
graybackmean += ((gray[i][j]) & (0x0000ff));
back++;
} else {
grayfrontmean += ((gray[i][j]) & (0x0000ff));
front++;
}
}
}
grayfrontmean = (int) (grayfrontmean / front);
graybackmean = (int) (graybackmean / back);
G[s] = (((float) back / area) * (graybackmean - average)
* (graybackmean - average) + ((float) front / area)
* (grayfrontmean - average) * (grayfrontmean - average));
s++;
}
float max = G[0];
int index = 0;
for (int i = 1; i < frontvalue - backvalue + 1; i++) {
if (max < G[i]) {
max = G[i];
index = i;
}
}
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int in = j * width + i;
if (((gray[i][j]) & (0x0000ff)) < (index + backvalue)) {
pix[in] = Color.rgb(0, 0, 0);
} else {
pix[in] = Color.rgb(255, 255, 255);
}
}
}
Bitmap temp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
temp.setPixels(pix, 0, width, 0, 0, width, height);
image.setImageBitmap(temp);
}
分享到:
相关推荐
图片二值化处理:将彩色图转化为黑白图
Android实现图像二值化的代码,不知为什么灰度化时简单的像素操作不能达到合适的效果(二值化后图片发绿),最后用setSaturation(0)实现。本人刚学Android,代码是模仿其他人的一个反色处理写的。有不成熟的地方望...
为android提供的二值化jni库,和完整demo,比Java代码的效率高10s! 一个基于jni的图像处理工具 包括二值化 灰度化 膨胀 腐蚀 等等 是android上图像处理的好例子 还能提高处理速度!实现点阵图的转化
为android提供的二值化jni库,和完整demo,比Java代码的效率高! 一个基于jni的图像处理工具 包括二值化 灰度化 膨胀 腐蚀 等等 是android上图像处理的好例子 还能提高处理速度
自适应二值化的代码,java形式,可以用在imagej等支持java的图像处理平台。
C++图像二值化代码,很简单能看懂,很简单能看懂,很简单能看懂。
如何在android处理图片 图像二值化、锐化、转换格式
android图片二值化demo,一个基于jni的图像处理工具 包括二值化 灰度化 膨胀 腐蚀 等等,比纯Java算法快 是android上图像处理的好例子 还能提高处理速度
先调用android的系统工具,获取图片生成bitmap文件,再使用android中的二值化技术,将图片转化成黑白图片
主要介绍了Android实现图像灰度化、线性灰度变化和二值化处理方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
安卓Android源码——(Bitmap位图渲染与操作).zip
for(i=1;i;i++)//腐蚀 { for (int j=1;j;j++) { int flag = 1; { flag=0; } if(flag==0) { data[i][j] = 255; } else { data[i][j] = 0; } } }
该demo 简单实现了 根据网络图片的 url 得到一个bitmap对象,再对这个bitmap对象,做处理 如 灰度化、线性 灰度化、二值化
Socket,蓝牙等二进制数据处理工具,可以把Object里的所有字段值转化成二进制值,然后拼起 来,形成一个二进制数据包,并且可以把二进制数据流填充到实体对象进,形成了序列化与反序列化的工具集
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
基于tesseract-OCR的Android端手机图像文字识别项目,通过调用手机摄像头进行文字识别,默认语言包是英文,需要放在/mnt/tesseract/tessdata目录下,需要识别中文的可以自行配置,项目中有简单的图像二值化去噪算法...
English version is being re-translated, coming soon... Android平台中对页面、原生路由功能...跨模块方法调用(入参和结果值) 三、基础功能 添加依赖和配置 android { defaultConfig { ... javaCompileOptions {
本书是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书。本书避免出现云山雾罩、晦涩难懂的讲解,代之以轻松活泼、由浅入深的剖析。这必将使得阅读本书的读者少走弯路,...
通过JNI试用C语言对图像进行处理,灰度化,二值化,求边缘等。对Android开发人员很有帮助,值得参考。
然后,构建三维查找表并据此完成二值化,通过噪声处 理和几何方法确定出候选人脸区域并对其进行尺度和灰度归一化; 最后,通过计算候选人脸和标准人脸模板 之间的加权欧氏距离来度量二者的匹配程度,并依据阈值判断...