文档章节

迭代法求图像的最佳阀值

自由的角马
 自由的角马
发布于 2015/01/10 13:58
字数 640
阅读 15
收藏 0

在《图像的采样与量化及直方图》中讲述了如何计算图像的灰度直方图及对图像进行二值化处理,在这一文章中讲述的二值化处理的阀值都是自己设定的,自己设定的阀值往往不准确,而且不同的图像的最佳阀值是不一样的。那么能不能让计算机来计算图像的最佳阀值呢?答案是肯定的,下面就介绍一种迭代法计算图像阀值的方法:

算法思想

迭代法是基于逼近的思想,其步骤如下:

1.  求出图象的最大灰度值和最小灰度值,分别记为Pmax和Pmin,令初始阈值T0=(Pmax+Pmin)/2;

2.  根据阈值T(k)(k=0,1,2...,k)将图象分割为前景和背景,分别求出两者的平均灰度值H1和H2;

3.  求出新阈值T(k+1)=(H1+H2)/2;

4.  若T(k)=T(k+1),则所得即为阈值;否则转2,迭代计算。

源码(java)

/**
	 * 用迭代法 求最佳阀值
	 * @param pix 灰度像素数组
	 * @return 最佳阀值
	 */
	public int iterationGetThreshold(int[] pix) {
		int min = pix[0], max = pix[0];
		for(int i=0; i<pix.length; i++) {
			if(pix[i] > 255) {
				pix[i] = 255;
			}
			if(pix[i] < 0) {
				pix[i] = 0;
			}
			if(min >pix[i])
				min = pix[i];
			if(max <pix[i])
				max = pix[i];
		}
		double histo[] = getHisto(pix);
		int threshold = 0;
		int newThreshold = (int) ((min+max)/2);;
		while(threshold != newThreshold) {
			double sum1=0, sum2=0, w1=0, w2=0 ;
			int avg1, avg2;
			for(int i=min; i<newThreshold; i++) {
				sum1 += histo[i]*i;
				w1 += histo[i];
			}
			avg1 = (int) (sum1/w1);
			for(int i=newThreshold; i<max; i++) {
				sum2 += histo[i]*i;
				w2 += histo[i];
			}
			avg2 = (int) (sum2/w2);
			//System.out.println("avg1:" + avg1 + "  avg2:" + avg2 + "  newThreshold:" + newThreshold);
			threshold = newThreshold;
			newThreshold = (avg1+avg2)/2;
		}
		return newThreshold;
		
		/*if(min==0 && max == 255) {
			return (min+max)/2;
		} else {
			int t = (min+max)/2;
			double sum1=0, sum2=0, w1=0, w2=0 ;
			int avg1, avg2;
			for(int i=min; i<t; i++) {
				sum1 += histo[i]*i;
				w1 += histo[i];
			}
			avg1 = (int) (sum1/w1);
			for(int i=t; i<max; i++) {
				sum2 += histo[i]*i;
				w2 += histo[i];
			}
			avg2 = (int) (sum2/w2);
			return (avg1+avg2)/2;
		} */
	}
	/**
	 * 求图像的灰度直方图
	 * @param pix 一维的灰度图像像素值
	 * @return 0-255的 像素值所占的比率
	 */
	public double[] getHisto(int pix[]) {
		double histo[] = new double[256];
		for(int i=0; i<pix.length; i++) {
			//System.out.println("pix[i]:" + pix[i]);
			if(pix[i] > 255) {
				pix[i] = 255;
			}
			if(pix[i] < 0) {
				pix[i] = 0;
			}
			histo[pix[i]] ++;
		}
		for(int i=0; i<255; i++) {
			histo[i] = (double)histo[i]/pix.length;
		}
		return histo;
	}
	/**
	 * 求二值图像
	 * @param pix 像素矩阵数组
	 * @param w 矩阵的宽
	 * @param h 矩阵的高
	 * @param threshold 阀值
	 * @return 处理后的数组
	 */
	public int[] threshold(int pix[], int threshold) {
		for(int i=0; i<pix.length; i++) {
			if(pix[i] <= threshold) {
				pix[i] = 0;		
			} else {
				pix[i] = 255;
			}				
		}	
		return pix;
	}


本文转载自:http://blog.csdn.net/luoweifu/article/details/8798442

自由的角马
粉丝 1
博文 269
码字总数 0
作品 0
文山
私信 提问
【OpenCV3.3】检测图像中的身份证区域

假设现有一些含身份证前景以及不确定背景的图像,想通过计算机将身份证区域检测出来,实现诸如用户拍照定位提示、背景分离等业务,用OpenCV该如何做呢?如果输入图像前景和背景同时具有一定区...

wjf1997
2017/08/16
0
0
Java基于opencv实现图像数字识别(五)—投影法分割字符

Java基于opencv实现图像数字识别(五)—投影法分割字符 水平投影法 1、水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像); 2、选出一个最优的阀值,根据比这个阀值大...

奇迹迪
2018/07/03
0
0
(三)matlab数字图像处理实验-图像灰度变换处理

前两节都是熟悉一下怎么在matlab底下对图片做一些操作,并没有什么卵用,这一节稍微有点卵用,灰度变换一般是图像处理的第一步。 数字图像处理实验1-9点击下列链接有源码和链接: matlab数字...

aninstein
2018/01/06
0
0
图像的灰度图 和 二值化的概念

原文地址 在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的取值范围均为0~255,比如电脑屏幕上的一个红色的像素点的三个...

liuhongyi0104
2018/03/23
0
0
灰度图像的阈值化

通过对灰度图像二值化处理,能够凸现出感兴趣目标的轮廓. 灰度图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适...

文艺小青年
2017/07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部