网上找了很多,没有一个能用的,本文的方法是自己在别人的基础上修改而来,纯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);
}
- 大小: 47 KB
- 大小: 250.6 KB
分享到:
相关推荐
在Android开发中,图片处理是一项常见的任务,尤其是在创建交互式应用或者进行图像分析时。...无论是简单的应用需求还是复杂的人工智能算法,图片二值化都是图像预处理的重要一环,为后续的图像分析和识别奠定了基础。
为android提供的二值化jni库,和完整demo,比Java代码的效率高10s! 一个基于jni的图像处理工具 包括二值化 灰度化 膨胀 腐蚀 等等 是android上图像处理的好例子 还能提高处理速度!实现点阵图的转化
一个简单的二值化算法可能包括以下步骤: 1. 读取图像数据:通过JNI接口,从Bitmap对象中获取原始图像的像素数据。 2. 灰度化:将RGB三通道图像转换为单通道灰度图像,通常使用加权平均公式(R * 0.299 + G * 0.587...
在Android平台上处理图片是开发过程中常见的任务之一,其中包括多种图像操作,如图像二值化、锐化以及转换格式。以下是对这些概念的详细说明: **图像二值化**: 图像二值化是一种将图像转化为黑白两色调的过程,常...
利用误差扩散算法中的Floyd-Steinberg抖动算法来对图像进行二值化处理,从而方便图像调频加网输出Floyd-Steinberg
在Android开发中,感知哈希(Perceptual Hashing,简称pHash)是一种用于比较图像相似性的算法。这种算法能够生成一个简化的、固定大小的图像指纹,即使图像经过缩放、旋转或轻微修改,其生成的哈希值仍然相似。这种...
**二、A*算法的步骤** 1. 初始化:设置起始节点g(n)=0,h(n)为从起始节点到目标节点的启发式估计,f(n)=g(n)+h(n),并将起始节点加入开放列表。 2. 当开放列表非空时,选择f值最小的节点作为当前节点。 3. 将当前...
当然,除了手动实现之外,Android还提供了其他图像处理库,如OpenCV、Picasso、Glide等,它们可能包含更高级的图像处理功能,包括自动化的二值化算法,使用这些库可以简化代码并提高效率。 总结来说,将Android中的...
**JBIG(Joint Bi-level Image Group)二值图像压缩算法是一种专为黑白图像设计的高效压缩标准,其第二版JBIG2则是这个领域的国际标准。本文将深入探讨JBIT2编码实现的关键技术和流程,以及在C++中的实现方法。** ...
通过这个项目,开发者不仅可以学习到如何运用回溯算法解决实际问题,还能深入理解Android应用开发,包括UI设计、数据持久化、用户交互等多方面知识。对于希望提高编程技能和了解算法应用的Android开发者来说,这是一...
在Android应用开发中,设计一个用户友好的登录界面是至关重要的。这个登录界面不仅需要包含基本的账号和密码输入字段,还要提供账号密码保存功能,确保数据的安全性,并且能够适时展示各种弹出对话框(Dialog)以...
在信息化和人工智能技术的快速发展背景下,Android终端的手势识别和控制技术已经受到了广泛关注。这一技术的主要应用包括手势换台、音量调节、手机开关机和解锁屏幕等功能,极大地丰富了人机交互的方式。 本文介绍...
- **模糊效果**:可以使用RenderScript或者自定义算法实现Bitmap的模糊处理。 6. **性能优化**: - **使用池化**:使用BitmapPool来复用Bitmap对象,减少内存分配和回收的开销。 - **异步加载**:在后台线程加载...
然后,在代码中,你可以实例化LocationManager并请求GPS位置更新: ```java LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); locationManager.requestLocationUpdates...
常用的人脸检测方法有Haar特征级联分类器、Adaboost算法、局部二值模式(LBP)和深度学习模型如SSD(Single Shot MultiBox Detector)或YOLO(You Only Look Once)。Android中通常使用开源库如OpenCV来实现这些算法,...
PCM波形图绘制算法是将PCM音频数据转换为可视化的波形图, Android屏幕坐标系与Canvas坐标系的关系是屏幕的起始坐标在屏幕的左上角,由(0,0)坐标向下Y 坐标增长,向右横坐标增长。Canvas类在屏幕上绘图,理论上讲...
#### 第一步:敏感词库初始化 在Java中,我们可以使用HashMap存储敏感词库。首先,将所有敏感词从数据库或列表加载到HashSet中,以去除重复项。接着,将HashSet中的敏感词添加到HashMap中,其中键是敏感词的首字符...
3. R波候选点检测:通过检测信号的局部最大值,找到可能的R波位置。常用的方法有导数法、希尔伯特变换等。 4. R波确认:对候选点进行二次判断,排除假阳性点。这一步可能涉及阈值比较、时间间隔分析等,确保R波的...
在系统中,首先获取10个二值化样本图像的宽度和高度像素值,并初始化一个三维整型数组SAMPLE_ARR,用于存储样本图像的黑白信息。白点表示1,黑点表示0。然后将样本数组输出到文件,以备后续的像素匹配使用。 2. **...