图像二值化——最大类间方差法(Ostu,大津法)
1、最大类间方差法的由来
最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。
2、最大类间方差法的原理
它是按图像的灰度特性,将图像分成背景和目标两部分。背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。对于图像I(x,y),前景(即目标)和背景的分割阈值记作Th,属于前景的像素点数占整幅图像的比例记为w1,其平均灰度G1;背景像素点数占整幅图像的比例为w2,其平均灰度为G2。图像的总平均灰度记为G_Ave,类间方差记为 g。
假设图像的背景较暗,并且图像的大小为M*N,图像中像素的灰度值小于阈值的像素个数记作N1,像素灰度大于阈值的像素个数记作N2,则有:
3、代码实现
#include <opencv2\opencv.hpp>
#include <iostream>
#include <time.h>
using namespace std;
using namespace cv;int myOtsu(Mat & src)
{int th;const int GrayScale = 256; //单通道图像总灰度256级int pixCount[GrayScale] = { 0 };//每个灰度值所占像素个数int pixSum = src.cols * src.rows;//图像总像素点float pixPro[GrayScale] = { 0 };//每个灰度值所占总像素比例float w0, w1, u0tmp, u1tmp, u0, u1, deltaTmp, deltaMax = 0;for (int i = 0; i < src.cols; i++){for (int j = 0; j < src.rows; j++){pixCount[src.at<uchar>(j, i)]++;//统计每个灰度级中像素的个数 }}for (int i = 0; i < GrayScale; i++){pixPro[i] = pixCount[i] * 1.0 / pixSum;//计算每个灰度级的像素数目占整幅图像的比例 }// 遍历所有从0到255灰度级的阈值分割条件,测试哪一个的类间方差最大// 即遍历0-255灰度级,尝试以其中任意一个作为阈值,计算最大类间方差for (int i = 0; i < GrayScale; i++){w0 = 0; //w1 = 0;u0tmp = 0;u1tmp = 0;u0 = 0;u1 = 0;deltaTmp = 0;for (int j = 0; j < GrayScale; j++) {//当前阈值为i的时,遍历小于阈值i的灰度级(背景),if (j <= i){w0 += pixPro[j]; //计算大于阈值的像素点个数w0u0tmp += j * pixPro[j]; //计算灰度级*当前灰度级下像素点个数 的总和:u0tmp}//当前阈值为i的时,遍历大于阈值i的灰度级(前景)else{w1 += pixPro[j]; //计算大于阈值的像素点个数w1u1tmp += j * pixPro[j]; //计算灰度级*当前灰度级下像素点个数 的总和:u0tmp}}u0 = u0tmp / w0; u1 = u1tmp / w1;deltaTmp = (float)(w0 *w1* pow((u0 - u1), 2)); //类间方差公式 g = w1 * w2 * (u1 - u2) ^ 2if (deltaTmp > deltaMax) //如果当前的最大类间方差值最大,则将当前类间方差值作为最大类间方差值{deltaMax = deltaTmp;th = i; //此时的阈值作为最佳阈值}}return th; //返回最佳阈值
}int main()
{Mat src = imread("2.png", IMREAD_GRAYSCALE);//单通道读取图像/*my_dst: 自己实现的大津法 得到的处理图像otsu_dst:opencv自带的大津法 得到的处理图像sub:两个处理图像相差图*/Mat my_dst, otsu_dst, sub;/*my_th: 自己实现的大津法 得到的最大类件方差 即阈值th:opencv自带的大津法 得到的最大类件方差 即阈值*/int my_th, th;/*计算开销时间,对比两个算法效率*/long my_start = clock(); //开始时间{my_th = myOtsu(src);threshold(src, my_dst, my_th, 255, CV_THRESH_BINARY);}long my_finish = clock(); //结束时间long my_t = my_finish - my_start;printf("The run time is:%9.3lf\n", my_t, "ms!\n"); //输出时间cout << "myOtsu threshold >> " << my_th << endl;long otsu_start = clock(); //开始时间{th = threshold(src, otsu_dst, 0, 255, CV_THRESH_OTSU);}long otsu_finish = clock(); //结束时间long t = my_finish - my_start;printf("The run time is:%9.3lf\n", (double)t / CLOCKS_PER_SEC, "ms!\n"); //输出时间cout << "Otsu threshold >> " << th << endl;subtract(otsu_dst, my_dst, sub);//两图像相减imshow("src", src);imshow("myOtsu", my_dst);imshow("Otsu", otsu_dst);imshow("Sub", sub);waitKey();system("pause");return 0;
}
原始图像:
自己最大类间方差法得到的二值图像
opencv自带的ostu方法得到的二值图像
补充:根据最佳阈值对图像进行二值化
图像二值化——最大类间方差法(Ostu,大津法)相关推荐
- C#,图像二值化(06)——全局阈值的大津算法(OTSU Thresholding)及其源代码
1.大津算法OTSU ALGORITHM OTSU算法效果很一般. 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU, ...
- 图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU)
图像二值化(Image Binarization):平均值法.双峰法.大津算法(OTSU) 编程实现图像的二值化,分析不同的阈值对二值化图像的影响. 问题描述 传统的机器视觉通常包括两个步骤:预处理和 ...
- 图像二值化中阈值算法浅析
目录 什么是二值化 常见的求阈值算法 OSTU大津法 概念及原理 iteration迭代法 概念及原理 代码实现 Sobel算子图像边缘提取 概念及原理 代码实现 噪点过滤 什么是二值化 所谓图像二值 ...
- 图像二值化之最大类间方差法(大津法,OTSU)
参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...
- CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)
引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...
- 【编程语言】利用CImage类对图像像素的处理(图像二值化)
最近做的课程作业需要用到CImage函数处理图像,其中涉及到读取图像以及对图像像素进行操作,在这里记录一下自己的理解. 首先是CImage类的定义和读取图片 CImage srcImage;CIm ...
- OTSU算法对图像二值化
出处:http://blog.csdn.net/WuHaibing_CVer OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法. 1. OTSU算法原理简介 对于一幅图 ...
- 二值化图像的欧拉数_Android OpenCV(八):图像二值化
图像二值化 简介 图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程.在数字图像处理中,二值图像占有非常重要的 ...
- OTSU_图像二值化分割阈值的算法
简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...
- 一文搞懂图像二值化算法
传统的机器视觉通常包括两个步骤:预处理和物体检测.而沟通二者的桥梁则是图像分割(Image Segmentation)[1].图像分割通过简化或改变图像的表示形式,使得图像更易于分析. 举个例子,食品 ...
最新文章
- js生成随机数函数,倒计时函数
- Ubantu 16.04中文输入问题解疑
- 设计模式之策略模式(strategy)--游戏角色使用武器
- C语言程序流程设计之循环【程序流程设计】(13)
- linux nslookup脚本,Linux中nslookup命令起什么作用呢?
- Android中Activity和task,活动亲和力,启动模式,活动状态以及生命周期,激活钝化
- ConcurrentHashMap的源码分析-为什么要做高低位的划分
- FastDFS整合SpringBoot - 实现service
- python win10 arm_windows10 arm版下载-windows10arm镜像64位中文版 - 极光下载站
- 倒计时6天|2020腾讯广告犀牛鸟计划申请即将截止,错过再等一年!
- 构建高性能.NET应用之配置高可用IIS服务器-第三篇 IIS中三个核心组件的讲解(上)...
- 放苹果(整数划分变形题 水)poj1664
- 清华计算机网络所教授张,2019计算机考研清华大学计算机网络技术研究所简介...
- 【黑苹果教程】修复OS X 10.11+上HD4200/HD4400/HD4600/HD5600驱动
- EndNoteX9完整详细安装教程
- smartbi v7 Linux,Smartbi版本更新
- python tkinter messagebox 自动关闭_Python实现定时自动关闭的tkinter窗口方法
- AcWing 120 防线
- asii和unicode格式字符串之间的相互转换
- 微信文件分享的那些坑