网上找了很多,没有一个能用的,本文的方法是自己在别人的基础上修改而来,纯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中,实现图片二值化的步骤如下: 1. **读取图片**:首先,我们需要使用`BitmapFactory`类的`decodeResource()`或`decodeStream()`方法从资源文件或流中加载图片,得到`Bitmap`对象。 2. **获取像素数据**...
Android实现图像二值化的代码,不知为什么灰度化时简单的像素操作不能达到合适的效果(二值化后图片发绿),最后用setSaturation(0)实现。本人刚学Android,代码是模仿其他人的一个反色处理写的。有不成熟的地方望...
为android提供的二值化jni库,和完整demo,比Java代码的效率高10s! 一个基于jni的图像处理工具 包括二值化 灰度化 膨胀 腐蚀 等等 是android上图像处理的好例子 还能提高处理速度!实现点阵图的转化
在Android开发中,有时我们需要对图像进行高效处理,例如将彩色图片转换为黑白图片,或者进一步进行二值化处理。二值化是图像处理的一种重要技术,它将图像中的像素点灰度值转化为两个固定值,通常是0和255,以达到...
自适应二值化的代码,java形式,可以用在imagej等支持java的图像处理平台。
C++图像二值化代码,很简单能看懂,很简单能看懂,很简单能看懂。
在Android平台上处理图片是开发过程中常见的任务之一,其中包括多种图像操作,如图像二值化、锐化以及转换格式。以下是对这些概念的详细说明: **图像二值化**: 图像二值化是一种将图像转化为黑白两色调的过程,常...
在Android平台上进行图像处理时,有时我们需要对图片进行二值化操作,以便简化图像内容,增强对比度,或者用于字符识别、图像分析等场景。"AndroidImage图片二值化jni"是一个利用JNI(Java Native Interface)技术...
对于二值化图像,去除孔洞时采用的方法实际上与去除小区域相同,因此完全可以用同一个函数进行。 这两个功能可以采取区域生长法来实现。须注意,去除小区域时为保存有用信息,可采用8邻域探测,去除孔洞时则4邻域...
Android 实现图像灰度化、线性灰度变化和二值化处理方法 图像处理是计算机视觉和图像处理领域的重要部分,Android 平台上实现图像灰度化、线性灰度变化和二值化处理方法是 Android 开发者需要掌握的重要技术。下面...
当然,除了手动实现之外,Android还提供了其他图像处理库,如OpenCV、Picasso、Glide等,它们可能包含更高级的图像处理功能,包括自动化的二值化算法,使用这些库可以简化代码并提高效率。 总结来说,将Android中的...
在Android应用开发中,国际化的实现是一个重要的环节,它使得应用程序能够支持多种语言,从而吸引全球范围内的用户。本项目“Android国际化Demo”是基于Android Studio构建的一个实例,旨在展示如何实现在Android...
这份"安卓Android源码——(Bitmap位图渲染与操作)"的资料,很可能是深入讲解如何在Android系统中有效地管理和操作位图资源的教程或示例代码集合。 1. **Bitmap基本概念**: Bitmap对象是Android中的一个核心类,它...
二、实现Android应用的多语言支持 要让Android应用支持多语言,开发者需要为每种支持的语言提供一组特定的字符串资源。Android使用资源文件来实现这一功能,这些文件包含了应用程序在不同语言环境下所需要的文本资源...
在Android开发中,日期格式化是一项常见的需求,用于将系统时间或特定时间转换为易于阅读和处理的格式。本文将深入探讨几个关键的日期格式化方法,这些方法可以帮助开发者更好地管理和展示日期信息。 ### 一、基本...
在Android开发中,二维图形是构建用户界面和创建动态效果不可或缺的部分。Android系统提供了一个定制的2D图形库,使得开发者能够轻松地绘制图形、图像并实现动画效果。本文将探讨如何在Android应用程序中利用...
二、字符串资源的本地化 1. 创建strings.xml:在对应的values目录下创建strings.xml文件,例如在values-zh-rCN目录下创建strings.xml,将中文版本的字符串资源放入其中。 2. 翻译字符串:在strings.xml文件中,...
标题中的“Android-byte数据序列化成对象”指的是将接收到的二进制数据解析成Android的对象。这个过程通常包括以下几个步骤: 1. 将接收到的字节数组按照特定的协议(例如,自定义的字段长度标识、类型编码等)进行...
本文将详细介绍如何根据URL获取Bitmap,以及如何实现灰度化、线性灰度化和二值化的渲染处理。 首先,我们需要从网络上下载图片。Android提供了多种方式来实现这一目标,如使用`HttpURLConnection`或第三方库如...
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; } } }