精华内容
下载资源
问答
  • 最大类间方差法

    2013-04-15 16:04:13
    halcon 最大类间方差法 新的软件新的技术
  • 全局OTSU算法又称最大类间方差法或大津法,该方法的基本思想是根据选取的阈值将图像分为目标和背景两个部分,计算像素的灰度值对应的最大类间方差值,将类间方差值取最大时对应的阈值作为最佳阈值。 设图像最佳阈值...

    全局OTSU算法又称最大类间方差法或大津法,该方法的基本思想是根据选取的阈值将图像分为目标和背景两个部分,计算像素的灰度值对应的最大类间方差值,将类间方差值取最大时对应的阈值作为最佳阈值。

    设图像最佳阈值为 T ,T 将图像分为目标和背景。其中目标点数占总图像比例为

    ,平均灰度值为
    ;背景点数占图像比例为
    ,平均灰度值为

    +
    =1 (1)

    则图像的总平均灰度值为:

    (2)

    类间方差为:

    (3)

    可等价为:

    (4)

    推导过程:

    利用公式(2)

    利用公式(1)

    利用公式(1)

    展开全文
  • 最大类间方差法(大津法OTSU)

    万次阅读 多人点赞 2016-07-23 16:15:19
    算法介绍最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时,...

    算法介绍

    最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时,两部分之间的差别应该是最大的,在OTSU算法中所采用的衡量差别的标准就是较为常见的最大类间方差。前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大,当部分目标被错分为背景或部分背景被错分为目标,都会导致两部分差别变小,当所取阈值的分割使类间方差最大时就意味着错分概率最小[1]。

    记T为前景与背景的分割阈值,前景点数占图像比例为w0w_0w0,平均灰度为u0u_0u0;背景点数占图像比例为w1w_1w1,平均灰度为u1u_1u1,图像的总平均灰度为uuu,前景和背景图象的方差,则有:
    u=w0×u0+w1×u1u = w_0 \times u_0+w_1 \times u_1u=w0×u0+w1×u1
    g=w0×(u0−u)2+w1×(u1−u)2g = w_0 \times (u_0-u)^2+w_1 \times (u_1-u)^2g=w0×(u0u)2+w1×(u1u)2
    联立上面两式可得:
    g=w0×w1×(u0−u1)2g = w_0 \times w_1 \times (u_0-u_1)^2g=w0×w1×(u0u1)2

    g=w01−w0×(u0−u)2g = \frac{w_0}{1-w_0} \times (u_0-u)^2g=1w0w0×(u0u)2
    当方差ggg最大时,可以认为此时前景和背景差异最大,此时的灰度T是最佳阈值。类间方差法对噪声以及目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。当目标与背景的大小比例悬殊时(例如受光照不均、反光或背景复杂等因素影响),类间方差准则函数可能呈现双峰或多峰,此时效果不好。直接用OTSU算法处理自然场景铭牌图片的部分结果实例如下:

    1
    图1.最大类间方差法二值化结果图1.最大类间方差法二值化结果1.

    代码实现

    (C语言版,VS2012+opencv249)
    注意,++和*的结合方式是由右向左,所以histogram[*p++]++ = (histogram[*(p++)])++

    #include "stdio.h"
    #include "cv.h"
    #include "highgui.h"
    #include "Math.h"
    
    int Otsu(IplImage* src);
    
    int main()
    {
    	IplImage* img = cvLoadImage("lena.jpg",0); //获取灰度图像img
    	IplImage* dst = cvCreateImage(cvGetSize(img), 8, 1);
    	int threshold = Otsu(img); //调用大津法求出最佳阈值
    	printf("otsu threshold = %d\n", threshold);
    	cvThreshold(img, dst, threshold, 255, CV_THRESH_BINARY); //用otsu的阈值二值化
    
    	cvNamedWindow( "img", 1 );
    	cvNamedWindow( "dst", 1 );
    	cvShowImage("img", img);
    	cvShowImage("dst", dst);
    
    
    	cvWaitKey(-1);
    
    	cvReleaseImage(&img);
    	cvReleaseImage(&dst);
    	
    	cvDestroyWindow( "img" );
    	cvDestroyWindow( "dst" );
    
    	return 0;
    }
    
    int Otsu(IplImage* src)  
    {  
    	int height=src->height;  
    	int width=src->width;      
    
    	//histogram  
    	float histogram[256] = {0};  
    	for(int i=0; i < height; i++)
    	{  
    		unsigned char* p=(unsigned char*)src->imageData + src->widthStep * i;  
    		for(int j = 0; j < width; j++) 
    		{  
    			histogram[*p++]++;  
    		}  
    	}  
    	
    	//normalize histogram & average pixel value 
    	int size = height * width;  
    	float u =0;
    	for(int i = 0; i < 256; i++)
    	{  
    		histogram[i] = histogram[i] / size;  
    		u += i * histogram[i];  //整幅图像的平均灰度
    	}  
    
    	int threshold;    
    	float maxVariance=0;  
    	float w0 = 0, avgValue  = 0;
    	for(int i = 0; i < 256; i++) 
    	{  
    		w0 += histogram[i];  //假设当前灰度i为阈值, 0~i 灰度像素所占整幅图像的比例即前景比例
    		avgValue  += i * histogram[i]; //avgValue/w0 = u0
    
    		float t = avgValue/w0 - u;  //t=u0-u
    		float variance = t * t * w0 /(1 - w0);  
    		if(variance > maxVariance) 
    		{  
    			maxVariance = variance;  
    			threshold = i;  
    		}  
    	}  
    
    	return threshold;  
    } 
    

    代码运行结果:
    2
    图2.otsu程序运行结果图2.otsu程序运行结果2.otsu

    代码下载:http://download.csdn.net/detail/u011285477/9584189

    博客链接:http://blog.csdn.net/u011285477/article/details/52004513

    参考资料:
    [1]Otsu N. A threshold selection method from gray-level histograms[J]. Automatica, 1975, 11(285-296): 23-27.

    展开全文
  • OTSU算法(大津法—最大类间方差法)原理及实现

    万次阅读 多人点赞 2019-05-13 22:26:12
    从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。 它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的...

    写在前面

    大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。

    它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

    应用:是求图像全局阈值的最佳方法,应用不言而喻,适用于大部分需要求图像全局阈值的场合。

    优点:计算简单快速,不受图像亮度和对比度的影响。

    缺点:对图像噪声敏感;只能针对单一目标分割;当目标和背景大小比例悬殊、类间方差函数可能呈现双峰或者多峰,这个时候效果不好。

    Opencv 接口:

    double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)

    Opencv 官方文档:https://docs.opencv.org/3.0-last-rst/modules/imgproc/doc/miscellaneous_transformations.html?highlight=threshold#threshold

    Github: https://github.com/2209520576/Image-Processing-Algorithm 。欢迎Star、Fork。
     

    原理

    原理非常简单,涉及的知识点就是均值、方差等概念和一些公式推导。为了便于理解,我们从目的入手,反推一下这著名的OTSU算法。

    求类间方差:

    OTSU算法的假设是存在阈值TH将图像所有像素分为两类C1(小于TH)和C2(大于TH),则这两类像素各自的均值就为m1、m2,图像全局均值为mG。同时像素被分为C1和C2类的概率分别为p1、p2。因此就有:

                                                                 p1*m1+p2*m2=mG                                           (1)

                                                                       p1+p2=1                                                      (2)

    根据方差的概念,类间方差表达式为:

                                                            \sigma ^{2}=p1(m1-mG)^{2}+p2(m2-mG)^{2}             (3)

    我们把上式化简,将式(1)代入式(3),可得:

                                                              \sigma ^{2}=p1p2(m1-m2)^{2}                                       (4)

    其实求能使得上式最大化的灰度级 k 就是OTSU阈值了,很多博客也是这样做的。

    其中:

                                                                p1=\sum_{i=0}^{k}p_{i}                                                       (5)     

                                                                 m1=1/p1 *\sum_{i=0}^{k}ip_{i}                                        (6)

                                                                 m2=1/p2 *\sum_{i=k+1}^{L-1}ip_{i}                                      (7)

    照着公式,遍历0~255个灰度级,求出使式(4)最大的 k 就ok了。

    -------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------

    但是根据原文(为了尊重原文),式(4)还可以进一步变形。

              首先灰度级K的累加均值m图像全局均值mG分别为:

                                                                  m=\sum_{i=0}^{k}ip_{i}                                                   (8)

                                                                  mG=\sum_{i=0}^{L-1}ip_{i}                                                (9)

                                                                  

    再瞅瞅式(6),m1、m2就可变为:

                                                               m1=1/p1 *m                                              (10)

                                                               m2=1/p2 *(mG-m)                                (11)

     式(10)、(11)代入式(4),我们可得原文最终的类间方差公式:

                                                            \sigma ^{2}=\frac{(mG*p1-m)^{_{2}}}{p1(1-p1)}                                      (12)

    根据公式(5)、(8)、(9)求能使得上式(12)最大化的灰度级 k 就是OTSU阈值。

     

    分割:

    这个分割就是二值化,OpenCV给了以下几种方式,很简单,可以参考:

     

    基于OpenCV实现

    #include <iostream>
    #include <opencv2/core.hpp>
    #include <opencv2/highgui.hpp>
    #include <opencv2/imgproc.hpp>
    
    int Otsu(cv::Mat& src, cv::Mat& dst, int thresh){
    	const int Grayscale = 256;
    	int graynum[Grayscale] = { 0 };
    	int r = src.rows;
    	int c = src.cols;
    	for (int i = 0; i < r; ++i){
    		const uchar* ptr = src.ptr<uchar>(i);
    		for (int j = 0; j < c; ++j){        //直方图统计
    			graynum[ptr[j]]++;
    		}
    	}
    
        double P[Grayscale] = { 0 };   
    	double PK[Grayscale] = { 0 };
    	double MK[Grayscale] = { 0 };
    	double srcpixnum = r*c, sumtmpPK = 0, sumtmpMK = 0;
    	for (int i = 0; i < Grayscale; ++i){
    		P[i] = graynum[i] / srcpixnum;   //每个灰度级出现的概率
    		PK[i] = sumtmpPK + P[i];         //概率累计和 
    		sumtmpPK = PK[i];
    		MK[i] = sumtmpMK + i*P[i];       //灰度级的累加均值                                                                                                                                                                                                                                                                                                                                                                                                        
    		sumtmpMK = MK[i];
    	}
    	
    	//计算类间方差
    	double Var=0;
    	for (int k = 0; k < Grayscale; ++k){
    		if ((MK[Grayscale-1] * PK[k] - MK[k])*(MK[Grayscale-1] * PK[k] - MK[k]) / (PK[k] * (1 - PK[k])) > Var){
    			Var = (MK[Grayscale-1] * PK[k] - MK[k])*(MK[Grayscale-1] * PK[k] - MK[k]) / (PK[k] * (1 - PK[k]));
    			thresh = k;
    		}
    	}
    
    	//阈值处理
    	src.copyTo(dst);
    	for (int i = 0; i < r; ++i){
    	    uchar* ptr = dst.ptr<uchar>(i);
    		for (int j = 0; j < c; ++j){
    			if (ptr[j]> thresh)
    				ptr[j] = 255;
    			else
    				ptr[j] = 0;
    		}
    	}
    	return thresh;
    }
    
    
    int main(){
    	cv::Mat src = cv::imread("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Img\\Fig1039(a)(polymersomes).tif");
    	if (src.empty()){
    		return -1;
    	}
    	if (src.channels() > 1)
    		cv::cvtColor(src, src, CV_RGB2GRAY);
    
    	cv::Mat dst,dst2;
    	int thresh=0;
    	double t2 = (double)cv::getTickCount();
    	thresh=Otsu(src , dst, thresh); //Otsu
    	std::cout << "Mythresh=" << thresh << std::endl;
    	t2 = (double)cv::getTickCount() - t2;
    	double time2 = (t2 *1000.) / ((double)cv::getTickFrequency());
    	std::cout << "my_process=" << time2 << " ms. " << std::endl << std::endl;
        double  Otsu = 0;
    
    	Otsu=cv::threshold(src, dst2, Otsu, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);
    	std::cout << "OpenCVthresh=" << Otsu << std::endl;
    
    	cv::namedWindow("src", CV_WINDOW_NORMAL);
    	cv::imshow("src", src);
    	cv::namedWindow("dst", CV_WINDOW_NORMAL);
    	cv::imshow("dst", dst);
    	cv::namedWindow("dst2", CV_WINDOW_NORMAL);
    	cv::imshow("dst2", dst2);
    	//cv::imwrite("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Image Filtering\\MeanFilter\\TXT.jpg",dst);
    	cv::waitKey(0);
    }

    效果

    先看看分割效果(和OpenCV自带构造函数对比):效果一样

                                 本文实现                                                      原图                                           opencv自带构造函数

                     

     

    再看看阈值求取的准确性和效率吧(和OpenCV自带构造函数对比):图像分辨率为702 * 648

                                                                               

    求出来的阈值和opencv一样,时间为1ms左右,速度还行。

     

    参考:

    https://www.cnblogs.com/ranjiewen/p/6385564.html

    http://www.dididongdong.com/archives/4614

    展开全文
  • 用matlab实现自适应图像阈值分割(最大类间方差法) %本程序是利用最大类间方差算法求解自适应阈值,对图像进行分割
  • OTSU是最大类间方差法,可以用了进行视频的前景提取,效果不错。
  •  通过对遗传算法的基本概念、遗传算法的流程、普通最大类间方差法(Otsu法)和研究遗传算法的最大类间方差研究;对基于遗传算法的最大类间方差进行改进,使得图像分割损失减少,分割效果增强。
  • 二维最大类间方差法相比一维otsu算法抗噪声能力更强,基本原理可以参考代码,也可以找相关论文进行学习,这里用matlab实现了快速二维最大类间方差法。二维otsu实现的效果相比一维otsu以及matlab自带的阈值分割函数...
  • Otsu最大类间方差法

    千次阅读 2017-08-26 17:34:51
    Otsu最大类间方差法 最大类间方差法,是由日本学者OTSU在1979年提出的一种对图像进行二值化的高效算法。 1.Otsu最大类间方差法原理 利用阈值将原图像分成前景、背景两个图像,当取最佳阈值时,背景应该与...

    Otsu最大类间方差法


    最大类间方差法,是由日本学者OTSU在1979年提出的一种对图像进行二值化的高效算法。

    1.Otsu最大类间方差法原理

    利用阈值将原图像分成前景、背景两个图像,当取最佳阈值时,背景应该与前景差别最大,关键在于如何选择衡量差别的标准,而在Otsu算法中这个衡量差别的标准就是最大类间方差。

    Otsu是在判决分析最小二乘法原理的基础上推导得出的,改法的基本思路是:选取的最佳阈值应当使得不同勒紧分离性最好。首先基于直方图得到个分割特性值的发生概率,并以阈值变量将分割特征值分为两类,然后求出每一类的类内方差及类间方差,选取使类间方差最大或类内方差最小的阈值T作为最佳阈值。

    2.关于Otsu的性能:

    类间方差法对噪声和目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差法是用时最少的。

    Otsu一直被认为是阈值自动选取方法中的最优方法,计算简单,在一定条件下不受图像对比度与亮度变化的影响,广泛应用在一些实时图像处理系统中。


    3.Otsu双阈值法

    基于Otsu的原理与步骤进行扩展,设置两个阈值(T1,T2)把图像灰度值分为三类,推导Otsu双阈值法如下。

    设一幅图像的灰度值为0~m级,灰度值为i的像素值为ni,则总像素数为:



    整幅图像的灰度平均值u为


    将全部灰度值分为三类:


    设C0出现的概率为w0,其灰度平均值为u0,

    C1出现的概率为w1,其灰度平均值为u1,

    C2出现的概率为w2,其灰度平均值为u2,则:


    这样,Otsu法求取阈值的公式就扩展为:


    根据上式求出每次对于的,其中的最大值对应的即是Otsu双阈值法对应的最佳阈值。


    利用Otsu求取单一阈值的时候,要求图像灰度直方图呈现明显的双峰特性(此时类间方差一元函数为单峰函数)。同理,采用Otsu双阈值法的时候要求图像灰度直方图呈现明显的三峰特性(此时类间方差二元函数为单峰函数)。否则,该算法可能失效,即算法的稳定性得不到保证。

    展开全文
  • OTSU最大类间方差法是由日本学者大津展之于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标两部分。背景和目标之间的类间方差越大,说明构成图像的两...
  • 学习笔记—《最大类间方差法》,本人在看论文的过程中涉及到了最大类间方差法,所以查找相关文献整理了一下,共享给大家!
  • 【图像分割】最大类间方差法(otsu)图像分割-附件资源
  • 图像处理4:最大类间方差法(大津法) (1)最大类间方差法简介: 最大类间方差法是一种自适应阈值确定的方法,又叫大津法,简称OTSU。 它是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景...
  • 最大类间方差法求解

    2017-12-26 14:56:51
    主要是求解最大类间方差的求解,对初学者有很大的作用
  • 最大类间方差法+形态学处理实现数硬币理论最大类间方差法图像的形态学处理实现步骤代码处理效果github地址 理论 最大类间方差法 部分搬运自文章:最大类间方差法(大津法OTSU) 简介 最大类间方差法是由日本学者大津...
  • c语言编的 最大类间方差法原理及程序 或许挺有用的
  • 此段代码是在C#环境下实现最大类间方差法。其中还有使用EMGUCV工具的用法。
  • 最大类间方差法(OTSU大津法) 大津算法,也被称作最大类间方差法,是一种可以自动确定二值化中阈值的算法。 从类内方差和类间方差的比值计算得来: 小于阈值ttt的类记作000,大于阈值ttt的类记作111; w0w_0w0​和...
  • 今天学习了otus最大类间方差法,在图像分割中最重要的,最困难的就是寻找出前景和背景的阈值,而otus可以自动寻找出最大类间方差。设t为前景与背景的分割阈值,前景点数占图像比例为w0(w0:前景像素点的个数除以总...
  • *最大类间方差法(OSTU) dev_update_off () read_image (Image1, 'F:/halcon_test/beraing/1 (5).bmp') get_image_size (Image1, Width, Height) dev_close_window () dev_open_window_fit_image (Image1, 0, 0, -...
  • 最大类间方差的求解过程,就是在解空间中查找到一个最优的解,使得其方差最大,而遗传算法能非线性快速查找最优解k及最大的方差,其步骤如下:1) 为了使用遗传算法,首先必须对实现解空间的数值编码,产生染色体单元...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 536
精华内容 214
关键字:

最大类间方差法