#include <stdio.h>
#include <string>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
// 大均法函数实现
int OTSU(cv::Mat srcImage)
{int nCols = srcImage.cols;int nRows = srcImage.rows;int threshold = 0;// 初始化统计参数int nSumPix[256];float nProDis[256];for (int i = 0; i < 256; i++){nSumPix[i] = 0;nProDis[i] = 0;}// 统计灰度级中每个像素在整幅图像中的个数 for (int i = 0; i < nCols; i++){for (int j = 0; j < nRows; j++){nSumPix[(int)srcImage.at<uchar>(i, j)]++;}}// 计算每个灰度级占图像中的概率分布for (int i = 0; i < 256; i++){nProDis[i] = (float)nSumPix[i] / (nCols * nRows);}// 遍历灰度级[0,255],计算出最大类间方差下的阈值  float w0, w1, u0_temp, u1_temp, u0, u1, delta_temp;double delta_max = 0.0;for (int i = 0; i < 256; i++){// 初始化相关参数w0 = w1 = u0_temp = u1_temp = u0 = u1 = delta_temp = 0;for (int j = 0; j < 256; j++){//背景部分 if (j <= i){// 当前i为分割阈值,第一类总的概率  w0 += nProDis[j];u0_temp += j * nProDis[j];}//前景部分   else{// 当前i为分割阈值,第一类总的概率w1 += nProDis[j];u1_temp += j * nProDis[j];}}// 分别计算各类的平均灰度 u0 = u0_temp / w0;u1 = u1_temp / w1;delta_temp = (float)(w0 *w1* pow((u0 - u1), 2));// 依次找到最大类间方差下的阈值    if (delta_temp > delta_max){delta_max = delta_temp;threshold = i;}}return threshold;
}
int main()
{// 图像读取及判断cv::Mat srcImage = cv::imread("22.jpg");if (!srcImage.data)return 1;// 灰度转换cv::Mat srcGray;cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);cv::imshow("srcGray", srcGray);// 调用OTSU二值化算法得到阈值int  ostuThreshold = OTSU(srcGray);std::cout << ostuThreshold << std::endl;// 定义输出结果图像cv::Mat otsuResultImage =cv::Mat::zeros(srcGray.rows, srcGray.cols, CV_8UC1);// 利用得到的阈值实现二值化操作for (int i = 0; i < srcGray.rows; i++){for (int j = 0; j < srcGray.cols; j++){// 满足大于阈值ostuThreshold置255if (srcGray.at<uchar>(i, j) > ostuThreshold)otsuResultImage.at<uchar>(i, j) = 255;elseotsuResultImage.at<uchar>(i, j) = 0;}}cv::imshow("otsuResultImage", otsuResultImage);cv::waitKey(0);return 0;
}

转载:http://blog.csdn.net/zhuwei1988

OTSU 二值化的实现相关推荐

  1. opencv otsu二值化

    在第一部分中我们提到过 retVal,当我们使用 Otsu 二值化时会用到它.那么它到底是什么呢? 在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答案就是不 ...

  2. CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)

    引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...

  3. 利用Python实现图像的二值化

    目录 1.全局阈值法 1.1主要函数: 1.2全局阈值的代码实现 1.3特点 2.自适应阈值法 2.1主要函数: 2.2实现代码: 2.3特点: 3.OTSU二值化(最大类间方差法) 3.1实现代码: ...

  4. opencv二值化找轮廓检测背景简单小物体

    一.前言 本篇主要是针对背景简单,且具有固定颜色的单类小物体,方法为在灰度化时选用图片的HSV中的S通道,再使用opencv 二值化找轮廓大法可将小物体框出. 原理很简单,图片->取S通道灰度化 ...

  5. 使用opencv进行Ostu二值化

    Otsu's Binarization Otsu 二值化 在第一部分,我说过这里有第二个参数retVal.如果我们使用Otsu我们将使用这个参数.怎么用呢? In the first section, ...

  6. Python实现图片二值化

    1. 什么是二值化 图像二值化就是将图像上的像素点的"灰度值"设置为[0, 0, 0]或[255, 255, 255],即要么纯黑,要么纯白. 2. 二值化的作用 通过二值化,能更 ...

  7. 二值化算法OTSU源码解析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 概述: 本文中小编将会跟大家分享一下OpenCV3.1.0中图像二 ...

  8. OTSU算法对图像二值化

    出处:http://blog.csdn.net/WuHaibing_CVer OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法. 1. OTSU算法原理简介 对于一幅图 ...

  9. 图像二值化之最大类间方差法(大津法,OTSU)

    参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...

最新文章

  1. 一文盘点2019年AI领域都发生了什么
  2. css数字发光,每日CSS_发光文本效果
  3. html5开发桌面界面设计,HTML5触摸界面设计与开发
  4. 关于文字邮件日文乱码的问题
  5. SpringMVC运行流程分析
  6. [转载]一个游戏程序员的学习资料
  7. 怎样玩转千万级别的数据
  8. android修改电量颜色,android状态栏电池颜色?
  9. postman如何发送application/json类的post请求
  10. VirtualBox的vdi文件复制
  11. VsDoc for jQuery
  12. Python全栈开发——subprocess struct
  13. 一元线性回归原理及python简单实现
  14. 基于buck电路的小型永磁同步电机最大功率跟踪控制
  15. 爬取QQ好友列表或定位QQ好友秘密
  16. 计算机桌面上任务栏在哪里,电脑桌面上的任务栏不见了怎么办
  17. 购买一台服务器安装 青龙面版 撸京豆 ~超详细~
  18. 2022年朝阳区科技创新课之“产品创新与成果转化”训练营活动圆满结束
  19. 微信小程序的家校通系统(家校联系)
  20. 那些年啊,那些事——一个程序员的奋斗史 ——17

热门文章

  1. CSP 201812-1 小明上学 Python实现+详解
  2. 零基础如何掌握web前端开发技能
  3. 学习UI设计都需要了解哪些知识
  4. 《JAVA与模式》之简单工厂模式
  5. 【转】超简单利用UGUI制作圆形小地图
  6. HDU 1816, POJ 2723 Get Luffy Out(2-sat)
  7. Centos 64位 Install certificate on apache 即走https协议
  8. linux下用phpize给PHP动态添加扩展
  9. Linux 裸设备基础知识(转)
  10. java考勤与工资管理系统