`
saybody
  • 浏览: 905437 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

OTSU方法计算图像二值化的自适应阈值

阅读更多

/*
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);
}

分享到:
评论

相关推荐

    基于matlab对灰度图像的二值化自适应阈值的算法_matlab_二值化_灰度

    在本话题中,我们将深入探讨基于MATLAB实现的灰度图像二值化自适应阈值算法。 首先,理解“自适应阈值”是关键。传统的全局二值化方法使用单一阈值对整个图像进行处理,但这种方法往往在光照不均匀或图像内容复杂的...

    MATLAB自适应阈值分割

    Otsu方法是自适应阈值分割中的经典算法之一,由Otsu于1975年提出,主要用于二值化图像。 Otsu方法的基本思想是寻找最佳的阈值,使得前景和背景类内的方差最小,而类间方差最大。这种方法假设图像的像素分布是双峰的...

    matlab.rar_binarization_binarization image_二值化 自适应_灰度自适应_自适应 阈值

    总的来说,二值化自适应阈值算法在MATLAB中的实现涉及了图像处理理论、统计分析以及编程技巧。掌握这些知识对于理解和改进图像识别、文字检测、医学影像分析等领域的应用至关重要。通过深入研究和实践,我们可以利用...

    otsu自适应阈值分割 用于图像分割二值化_二值化_分割_阈值

    3. 机器视觉:在工业检测和机器人导航中,Otsu二值化可以帮助识别目标物体,进行定位和追踪。 4. 图像压缩:通过二值化,可以减少图像的颜色层次,降低数据存储和传输的需求。 四、实现与优化 Otsu算法的实现通常...

    OTSU自适应阈值化

    OTSU自适应阈值化是一种在图像处理领域广泛使用的二值化方法,尤其适用于具有显著背景和前景对比的图像。二值化是将图像转换为黑白两色调的过程,有助于简化图像,提取特征,以及进行后续的分析和识别操作。本文将...

    otsu自适应阈值分割

    其中,Otsu自适应阈值分割是广泛应用的一种方法,尤其在二值化处理中效果显著。 **Otsu算法的原理** Otsu算法,也称为大津法,是一种自动确定全局阈值的方法。它的核心思想是寻找最佳的阈值,使得图像的内部类间...

    图像自适应二值化MATLAB程序

    3. **自适应二值化**:调用`adaptthresh`函数,传入预处理后的图像和选择的阈值计算方法('local'表示Gaussian邻域,'otsu'表示Otsu's方法)。例如: ```matlab bwImage = adaptthresh(img, 'otsu'); ``` 4. **...

    otsu.rar_OTSU阈值分割_otsu 图像处理_otsu算法MATLAB_图形分割_自适应阈值

    OTSU阈值分割,又称大津法,是图像处理领域中的一个经典算法,尤其适用于二值化处理。在实际应用中,它能够自动找到最佳阈值,将图像分割为前景和背景两部分,极大地简化了图像分析任务。 **一、算法原理** OTSU...

    Otsu_最大类间方差法,包含c和matlab版的程序和相关算法的文章,对于自适应阈值方法有很大的参考价值。

    MATLAB代码可能包括读取图像、计算直方图、执行Otsu算法以及进行二值化处理的步骤。 3. **相关算法文章**:这些文章可能详细介绍了Otsu算法的原理、计算过程以及与其他阈值方法的比较,对于深入理解该算法及其应用...

    图像二值化动态阈值确定算法

    图像二值化是一种重要的图像处理技术,常用于将图像转换为黑白两色调,便于后续的图像分析、识别和处理。动态阈值确定算法是解决这一问题的关键,它能根据图像的局部特性或全局特性自动调整阈值,提高二值化效果。在...

    自适应门限法图像二值化(matlab)

    "自适应门限法图像二值化"是其中的一种高级方法,它解决了传统固定阈值二值化在处理复杂场景时遇到的问题,如光照不均、图像噪声等。在MATLAB中,我们可以利用Ostu法(最大类间方差法)来实现这一过程。 Ostu法,...

    用matlab实现自适应图像阈值分割,可用.rar

    在图像处理领域,阈值分割是一种常见的图像二值化技术,它将图像中的像素值划分为两类,通常为前景和背景。自适应阈值分割是这种方法的一个变种,它能够根据图像局部区域的特性来确定阈值,从而更好地处理光照不均、...

    自适应阈值分割

    Otsu阈值算法是一种经典的自适应阈值分割方法,它通过最大化类间方差来确定最佳阈值。类间方差反映了前景和背景之间的差异性,当这个值最大时,意味着所选阈值能够最好地区分前景和背景。Otsu算法不仅简单高效,而且...

    opencv实现c++的otsu自适应阈值分割的算法描述.docx

    其中,Otsu自适应阈值分割算法是一个常用的图像分割方法,该算法可以自动选择合适的阈值来将图像分割为背景和目标区域。 Otsu算法的基本思想是选择使类间方差最大的灰度值作为阈值。具体来说,该算法首先计算图像的...

    二值图像基于局部自适应的阈值

    总结起来,局部自适应阈值是图像处理中的重要技术,它通过考虑图像的局部特性,提高了二值化的效果,特别适用于处理复杂光照条件下的图像。MATLAB等工具提供了方便的实现手段,使得我们能够根据具体需求定制适合的...

    OTSU方法阈值计算

    在提供的文件中,"OTSU方法计算图像二值化的自适应阈值.cpp"很可能是实现OTSU算法的源代码,可以用来对输入的图像进行二值化处理。而"www.pudn.com.txt"可能是一个链接或者说明文件,提供了更多关于代码来源或使用...

    otsu自适应阈值分割源码

    **OTSU自适应阈值分割**是一种在图像处理领域广泛应用的自动二值化技术,它由日本学者大津(Otsu Nobuyuki)于1979年提出。该方法主要用于将一幅灰度图像转化为黑白图像,即二值化处理,这对于文本识别、图像分析和...

Global site tag (gtag.js) - Google Analytics