/*
OTSU 算法可以说是自适应计算单阈值(用来转换灰度图像为二值图像)的简单高效方法。下面的代码最早由 Ryan Dibble提供,此后经过多人Joerg.Schulenburg, R.Z.Liu 等修改,补正。
转自:http://forum.assuredigit.com/display_topic_threads.asp?ForumID=8&TopicID=3480
算法对输入的灰度图像的直方图进行分析,将直方图分成两个部分,使得两部分之间的距离最大。划分点就是求得的阈值。
parameter: *image --- buffer for image
rows, cols --- size of image
x0, y0, dx, dy --- region of vector used for computing threshold
vvv --- debug option, is 0, no debug information outputed
*/
/*======================================================================*/
/* OTSU global thresholding routine */
/* takes a 2D unsigned char array pointer, number of rows, and */
/* number of cols in the array. returns the value of the threshold */
/*======================================================================*/
int otsu (unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int vvv)
{
unsigned char *np; // 图像指针
int thresholdValue=1; //阈值
int ihist[256]; // 图像直方图,256个点
int i, j, k; // various counters
int n, n1, n2, gmin, gmax;
double m1, m2, sum, csum, fmax, sb;
// 对直方图置零...
memset(ihist, 0, sizeof(ihist));
gmin=255; gmax=0;
//生成直方图
for (i = y0 + 1; i < y0 + dy - 1; i++) {
np = &image[i*cols+x0+1];
for (j = x0 + 1; j < x0 + dx - 1; j++) {
ihist[*np]++;
if(*np > gmax) gmax=*np;
if(*np < gmin) gmin=*np;
np++; /* next pixel */
}
}
// set up everything
sum = csum = 0.0;
n = 0;
for (k = 0; k <= 255; k++) {
sum += (double) k * (double) ihist[k]; /* x*f(x) 质量矩*/
n += ihist[k]; /* f(x)质量*/
}
if (!n) {
// if n has no value, there isproblems...
fprintf (stderr, "NOT NORMAL thresholdValue = 160\n");
return (160);
}
// do the otsu global thresholding method
fmax = -1.0;
n1 = 0;
for (k = 0; k < 255; k++) {
n1 += ihist[k];
if (!n1) { continue; }
n2 = n - n1;
if (n2 == 0) { break; }
csum += (double) k *ihist[k];
m1 = csum / n1;
m2 = (sum - csum) / n2;
sb = (double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);
/* bbg: note: can be optimized. */
if (sb > fmax) {
fmax = sb;
thresholdValue = k;
}
}
// at this point we have our thresholding value
// debug code to display thresholding values
if ( vvv & 1 )
fprintf(stderr,"# OTSU: thresholdValue = %d gmin=%d gmax=%d\n",
thresholdValue, gmin, gmax);
return(thresholdValue);
}
分享到:
相关推荐
otsu自适应阈值分割 用于图像分割二值化
OTSU算法可以自适应的实现阈值的二值化,这个主要是该算法的原理及实现的代码
otsu算法实现,可以自适应获取阈值,对图像进行二值化。里面配有图像均衡化的程序一起使用,效果更好
二值化阈值的选取方法,主要是选用经典的otsu方法,也成为大津法,是由日本人大津展之发明的
而一般的全局二值化如用Otsu方法获取最优阈值的方法,都是建立在图像前背景亮度有一定差距的基础上的,即图像直方图有双峰结构。 如果对于一幅亮度不均匀的图像这种方法就不适用,解决的方法可以把图像根据整体亮度...
OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法。大津法是一种图像灰度自适应的阈值分割算法,按照图像上灰度值的分布,将图像分成背景和前景两部分看待,前景就是我们要按照阈值分割出来的...
C++写的opencv代码,内含固定阈值、自适应(OTSU)二值化、局部自适应二值化方法,可以通过混动条调整参数,直观看阈值化效果
图像二值化的方法 全局阈值 局部阈值 OTSU Triangle 手动与自动 自适应阈值 相关代码 import cv2 as cv import numpy as np def threshold_demo(image): """ 全局阈值 :param image: :return: """ # 首先图像...
二值化算法:Otsu算法、Bernsen算法、Niblack算法、循环阈值算法、迭代二值化算法等matlab代码,入门级
在用python进行图像处理时,二值化是非常重要的一步,现总结了自己遇到过的6种 图像二值化的方法(当然这个绝对不是全部的二值化方法,若发现新的方法会继续新增)。 1. opencv 简单阈值 cv2.threshold 2. opencv ...
1,简单的阈值处理(二值化阈值处理、反二值化阈值处理、截断阈值处理、低于阈值0处理、超出阈值0处理) 2,自适应阈值处理(平均加权自适应、高速加权自适应) 3,Otsu阈值处理 除了代码外,还有代码中使用的图片,...
本算法将运动目标和背景作为两个聚类,对图像中的点按像素灰度进行分类,以聚类间的方根—算术均值距离最大作为分割阈值选择的准则,使得运动目标提取算法中二值化阈值能够自动更新,从而实现对运动目标的准确完整...
包括几种二值化方法,固定阈值、自适应阈值、Niblack、Otsu等等
对输入的视频进行二值化处理,选用二值化算法是自适应阀值的OTSU法
OTSU 算法可以说是自适应计算单阈值(用来转换灰度图像为二值图像)的简单高效方法。算法对输入的灰度图像的直方图进行分析,将直方图分成两个部分,使得两部分之间的距离最大。划分点就是求得的阈值。
二、利用OTSU自适应阈值算法将灰度图像二值化处理后并取反运算 三、对二值图像进行形态学处理,腐蚀运算后进行开运算 四、对二值图像进行距离变换和初次分水岭变换 五、对imextendedmin的以下调用应该只产生大致位于...
在MATLAB下实现OTSU算法,另外还有关于此算法的改进形式,对图像的阈值进行最佳的计算,提高二值化的效果
在图像处理中用于对图像进行二值化处理,自适应地确定二值化的阈值