`

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 实现!

相关推荐

    AndroidImage图片二值化jni

    android图片二值化demo,一个基于jni的图像处理工具 包括二值化 灰度化 膨胀 腐蚀 等等,比纯Java算法快 是android上图像处理的好例子 还能提高处理速度

    Android手机中人脸检测算法的改进及实现

    然后,构建三维查找表并据此完成二值化,通过噪声处 理和几何方法确定出候选人脸区域并对其进行尺度和灰度归一化; 最后,通过计算候选人脸和标准人脸模板 之间的加权欧氏距离来度量二者的匹配程度,并依据阈值判断...

    Android-OCR相机取景图像识别

    基于tesseract-OCR的Android端手机图像文字识别项目,通过调用手机摄像头进行文字识别,默认语言包是英文,需要放在/mnt/tesseract/tessdata目录下,需要识别中文的可以自行配置,项目中有简单的图像二值化去噪算法,...

    基于Android平台的车牌识别系统的研究

    根据实际拍摄环境的影响会造成车牌图像光照不均匀和光线过暗等现象,本文提出了一种合理的改进方法,即在进行Otsu二值化处理之前加入基于离散余弦变换的光照补偿校正处理,实验证明能够很好的改善上述现象。...

    OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软件库

    对图像进行二值化、4. 对图像进行边缘检测、5. 图像模糊、6.图像翻转、7. 尺度变换、8. 通过Java和OpenCV进行脸部检测、9. 通过Java和OpenCV进行图像拼接 OpenCV (Open Source Computer Vision Library) 是一个开源...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    6.2.1 二进制兼容性 136 6.2.2 提供了什么 136 6.2.3 缺什么 137 6.3 内存管理 137 6.3.1 内存分配 137 6.3.2 C语言的动态内存管理 138 6.3.3 C++的动态内存管理 139 6.4 标准文件I/O 141 6.4.1 标准流 141 ...

    基于QT的象棋代码

    第一章 1.QT基础介绍 2.象棋整体框架介绍 3.使用QT绘制棋盘 第二章 1.初始化棋子 2.走棋 ...4.象棋走棋规则和轮流规则 ...6.最小值最大值算法解释 第四章 1.网络版本的实现 2.android移植 3.复习参考代码

    操作系统课设项目基于Android的电梯调度源码+课程报告.zip

    2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...

    基于opencv和MFC的图像处理软件.zip

    图像的灰度化、二值化、滤波、边缘检测、直方图,视频的边缘检测和跟踪 OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用...

    基于tensorflow完整的文本分类(NLP)

    * l2_reg_lambda:L2正则化的系数,主要对全连接层的参数正则化 * max_grad_norm:梯度阶段临界值 * train_data:训练数据的存储路径 * eval_data:验证数据的存储路径 * stop_word:停用词表的存储路径 * output_...

    中国研究生数学建模竞赛B题-辛烷RON损失优化模型python源码+文档说明

    特征工程:缺失值填充 拉伊达准则 Richard Li (Lane) (第二问 + 第三问) 特征筛选:Pearson相关系数 预测模型:随机森林 随机搜索算法 ccmio (第四问 + 第五问) 优化模型:遗传算法 优化过程可视化 - 不懂运行,...

    3G手机等嵌入式技术终端实现监控,视频会议,即时通讯的平台开发

    “佰锐3G手机视频开发平台”封装了与手机相关的所有技术细节,并且采用模块化结构设计,方便用户进行二次开发。 三、网络拓扑结构图 “佰锐3G手机视频开发平台”采用分布式网络架构,流媒体服务器可以分别部署在...

    数据的秘密(下):如何分析数据?.pdf

    关注宏观和细节 大多数人都能做到关注宏观的数据,拿互联网产品来说,日活,月活,流失率,NPS(净推荐值) ,这些都是宏观的数据。宏观数据能够反映出产品的整体状况,是值得长期关注的。 但是在宏观之外,我们还...

Global site tag (gtag.js) - Google Analytics