OTSU 二值化的实现
#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 二值化的实现相关推荐
- opencv otsu二值化
在第一部分中我们提到过 retVal,当我们使用 Otsu 二值化时会用到它.那么它到底是什么呢? 在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答案就是不 ...
- CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)
引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...
- 利用Python实现图像的二值化
目录 1.全局阈值法 1.1主要函数: 1.2全局阈值的代码实现 1.3特点 2.自适应阈值法 2.1主要函数: 2.2实现代码: 2.3特点: 3.OTSU二值化(最大类间方差法) 3.1实现代码: ...
- opencv二值化找轮廓检测背景简单小物体
一.前言 本篇主要是针对背景简单,且具有固定颜色的单类小物体,方法为在灰度化时选用图片的HSV中的S通道,再使用opencv 二值化找轮廓大法可将小物体框出. 原理很简单,图片->取S通道灰度化 ...
- 使用opencv进行Ostu二值化
Otsu's Binarization Otsu 二值化 在第一部分,我说过这里有第二个参数retVal.如果我们使用Otsu我们将使用这个参数.怎么用呢? In the first section, ...
- Python实现图片二值化
1. 什么是二值化 图像二值化就是将图像上的像素点的"灰度值"设置为[0, 0, 0]或[255, 255, 255],即要么纯黑,要么纯白. 2. 二值化的作用 通过二值化,能更 ...
- 二值化算法OTSU源码解析
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 概述: 本文中小编将会跟大家分享一下OpenCV3.1.0中图像二 ...
- OTSU算法对图像二值化
出处:http://blog.csdn.net/WuHaibing_CVer OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法. 1. OTSU算法原理简介 对于一幅图 ...
- 图像二值化之最大类间方差法(大津法,OTSU)
参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...
最新文章
- 一文盘点2019年AI领域都发生了什么
- css数字发光,每日CSS_发光文本效果
- html5开发桌面界面设计,HTML5触摸界面设计与开发
- 关于文字邮件日文乱码的问题
- SpringMVC运行流程分析
- [转载]一个游戏程序员的学习资料
- 怎样玩转千万级别的数据
- android修改电量颜色,android状态栏电池颜色?
- postman如何发送application/json类的post请求
- VirtualBox的vdi文件复制
- VsDoc for jQuery
- Python全栈开发——subprocess struct
- 一元线性回归原理及python简单实现
- 基于buck电路的小型永磁同步电机最大功率跟踪控制
- 爬取QQ好友列表或定位QQ好友秘密
- 计算机桌面上任务栏在哪里,电脑桌面上的任务栏不见了怎么办
- 购买一台服务器安装 青龙面版 撸京豆 ~超详细~
- 2022年朝阳区科技创新课之“产品创新与成果转化”训练营活动圆满结束
- 微信小程序的家校通系统(家校联系)
- 那些年啊,那些事——一个程序员的奋斗史 ——17