`

Android二值化算法

 
阅读更多
网上找了很多,没有一个能用的,本文的方法是自己在别人的基础上修改而来,纯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
分享到:
评论
1 楼 sniciq 2013-04-07  
是不错,但是性能太差了!最好用C++改写,使用android NDK 实现!

相关推荐

    android图片的二值化处理

    在Android开发中,图片处理是一项常见的任务,尤其是在创建交互式应用或者进行图像分析时。...无论是简单的应用需求还是复杂的人工智能算法,图片二值化都是图像预处理的重要一环,为后续的图像分析和识别奠定了基础。

    android使用JNI图片转黑白图片实现二值化

    一个简单的二值化算法可能包括以下步骤: 1. 读取图像数据:通过JNI接口,从Bitmap对象中获取原始图像的像素数据。 2. 灰度化:将RGB三通道图像转换为单通道灰度图像,通常使用加权平均公式(R * 0.299 + G * 0.587...

    如何在android处理图片 图像二值化、锐化、转换格式.doc

    在Android平台上处理图片是开发过程中常见的任务之一,其中包括多种图像操作,如图像二值化、锐化以及转换格式。以下是对这些概念的详细说明: **图像二值化**: 图像二值化是一种将图像转化为黑白两色调的过程,常...

    Android-Android的感知哈希算法

    在Android开发中,感知哈希(Perceptual Hashing,简称pHash)是一种用于比较图像相似性的算法。这种算法能够生成一个简化的、固定大小的图像指纹,即使图像经过缩放、旋转或轻微修改,其生成的哈希值仍然相似。这种...

    Floyd-Steinberg抖动算法

    利用误差扩散算法中的Floyd-Steinberg抖动算法来对图像进行二值化处理,从而方便图像调频加网输出Floyd-Steinberg

    android 引入A*算法

    **二、A*算法的步骤** 1. 初始化:设置起始节点g(n)=0,h(n)为从起始节点到目标节点的启发式估计,f(n)=g(n)+h(n),并将起始节点加入开放列表。 2. 当开放列表非空时,选择f值最小的节点作为当前节点。 3. 将当前...

    android中将图片转化成黑白

    当然,除了手动实现之外,Android还提供了其他图像处理库,如OpenCV、Picasso、Glide等,它们可能包含更高级的图像处理功能,包括自动化的二值化算法,使用这些库可以简化代码并提高效率。 总结来说,将Android中的...

    jbig二值图像压缩算法编码实现

    **JBIG(Joint Bi-level Image Group)二值图像压缩算法是一种专为黑白图像设计的高效压缩标准,其第二版JBIG2则是这个领域的国际标准。本文将深入探讨JBIT2编码实现的关键技术和流程,以及在C++中的实现方法。** ...

    基于回溯算法的Android数独游戏源代码

    通过这个项目,开发者不仅可以学习到如何运用回溯算法解决实际问题,还能深入理解Android应用开发,包括UI设计、数据持久化、用户交互等多方面知识。对于希望提高编程技能和了解算法应用的Android开发者来说,这是一...

    Android 登录界面(含帐号密码保存、加密算法、弹出框dialog)

    在Android应用开发中,设计一个用户友好的登录界面是至关重要的。这个登录界面不仅需要包含基本的账号和密码输入字段,还要提供账号密码保存功能,确保数据的安全性,并且能够适时展示各种弹出对话框(Dialog)以...

    基于特征选择的Android终端手势控制算法.pdf

    在信息化和人工智能技术的快速发展背景下,Android终端的手势识别和控制技术已经受到了广泛关注。这一技术的主要应用包括手势换台、音量调节、手机开关机和解锁屏幕等功能,极大地丰富了人机交互的方式。 本文介绍...

    安卓Android源码——(Bitmap位图渲染与操作).zip

    - **模糊效果**:可以使用RenderScript或者自定义算法实现Bitmap的模糊处理。 6. **性能优化**: - **使用池化**:使用BitmapPool来复用Bitmap对象,减少内存分配和回收的开销。 - **异步加载**:在后台线程加载...

    Android GPS及filter实现

    然后,在代码中,你可以实例化LocationManager并请求GPS位置更新: ```java LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); locationManager.requestLocationUpdates...

    Android _人脸检测的源码_人脸识别

    常用的人脸检测方法有Haar特征级联分类器、Adaboost算法、局部二值模式(LBP)和深度学习模型如SSD(Single Shot MultiBox Detector)或YOLO(You Only Look Once)。Android中通常使用开源库如OpenCV来实现这些算法,...

    Android系统音频PCM波形图绘制算法与实现_梁浩

    PCM波形图绘制算法是将PCM音频数据转换为可视化的波形图, Android屏幕坐标系与Canvas坐标系的关系是屏幕的起始坐标在屏幕的左上角,由(0,0)坐标向下Y 坐标增长,向右横坐标增长。Canvas类在屏幕上绘图,理论上讲...

    java利用DFA算法实现敏感词过滤功能

    #### 第一步:敏感词库初始化 在Java中,我们可以使用HashMap存储敏感词库。首先,将所有敏感词从数据库或列表加载到HashSet中,以去除重复项。接着,将HashSet中的敏感词添加到HashMap中,其中键是敏感词的首字符...

    SoAndChan心电图ECG的R波侦测算法的C语言实现

    3. R波候选点检测:通过检测信号的局部最大值,找到可能的R波位置。常用的方法有导数法、希尔伯特变换等。 4. R波确认:对候选点进行二次判断,排除假阳性点。这一步可能涉及阈值比较、时间间隔分析等,确保R波的...

    基于像素匹配的Android平台身份证号码实时识别.pdf

    在系统中,首先获取10个二值化样本图像的宽度和高度像素值,并初始化一个三维整型数组SAMPLE_ARR,用于存储样本图像的黑白信息。白点表示1,黑点表示0。然后将样本数组输出到文件,以备后续的像素匹配使用。 2. **...

    基于Android的植物叶片图像病害检测.pdf

    最大类间差法是一种常用的图像分割算法,可以对图像进行二值化,提取叶片图像病害部分的边缘。Canny算子是一种常用的边缘检测算法,可以对图像进行边缘检测,获取叶片图像病害部分的边缘信息。 本文所提出的基于...

Global site tag (gtag.js) - Google Analytics