opencv与C++实现最大类间方差法(OTSU)进行图像二值化

2023-10-27

直接上代码,使用最大类间方差法进行二值化的函数

void threshold_otsu(Mat &mat, Mat &mat_thresh)    
//mat为输入图像,mat_thresh为二值化后的输出图像
{
	//求出图像的最大和最小像素值,确定阈值区间
	double min_value_mat, max_value_mat;
	Point min_position_mat, max_position_mat;
	minMaxLoc(mat, &min_value_mat, &max_value_mat, &min_position_mat, &max_position_mat);

	vector <double> var(max_value_mat - min_value_mat + 1);    /* 类间方差容器,不能用数组,因为数组要求用常量定义大小,而mat.rows和mat.cols是变量,除非给数组一个足够大的空间。mat.rows*mat.cols也不能少,否则会报错vector下标越界 */
	double thresh_value;   //二值化阈值
	int m = 0;    //m必须定义在第一层for函数外面,否则每次都会被初始化为0。
	for (thresh_value = min_value_mat; thresh_value < max_value_mat; thresh_value++)
	{
		double sum = mat.rows*mat.cols;     //图像像素点总数
		double sum_aim = 0, sum_bg = 0;     //目标和背景像素点总数
		double sum_vaule_aim = 0, sum_vaule_bg = 0;     //目标和背景像素点的总灰度
		for (int i = 0; i < mat.rows; i++)
			for (int j = 0; j < mat.cols; j++)
			{
				int vaule = mat.at<uchar>(i, j);
				if (vaule < thresh_value)     //背景
				{
					sum_bg += 1;
					sum_vaule_bg += vaule;
				}
				else       //目标
				{
					sum_aim += 1;
					sum_vaule_aim += vaule;
				}
			}
		double ratio_aim = sum_aim / sum;   //目标像素点所占比例
		double ratio_bg = sum_bg / sum;     //背景像素点所占比例
		double aver_vaule_aim = sum_vaule_aim / sum_aim;     //目标像素点的平均灰度
		double aver_vaule_bg = sum_vaule_bg / sum_bg;        //背景像素点的平均灰度
		double aver_vaule_mat = ratio_aim * aver_vaule_aim + ratio_bg * aver_vaule_bg;    //图像总平均灰度

		//计算每个阈值下的类间方差并保存到var中
		var[m] = ratio_aim * (aver_vaule_aim - aver_vaule_mat)*(aver_vaule_aim - aver_vaule_mat) +
			ratio_bg * (aver_vaule_bg - aver_vaule_mat)*(aver_vaule_bg - aver_vaule_mat);
		m += 1;
	}

	//找到最大类间方差以及其对应的阈值
	double var_max = 0, var_maxnum = 0;
	for (int k = 0; k < max_value_mat - min_value_mat; k++)
		if (var[k] > var_max)
		{
			var_max = var[k];
			var_maxnum = k + min_value_mat;
		}
	thresh_value = var_maxnum;

	//二值化,阈值以下的置为0,阈值以上的灰度值不变
	threshold(mat, mat_thresh, thresh_value, 255, 3);   
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv与C++实现最大类间方差法(OTSU)进行图像二值化 的相关文章

  • 如何使用 colorchecker 在 opencv 中进行颜色校准?

    我有数码相机获取的色彩检查器图像 我如何使用它来使用 opencv 校准图像 按照以下颜色检查器图像操作 您是想问如何进行颜色校准或如何使用 OpenCV 进行校准 为了进行颜色校准 您可以使用校准板的最后一行 灰色调 以下是您应该逐步进行
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • OpenCV:如何从网络摄像头获取原始 YUY2 图像?

    你知道如何获得吗raw YUY2来自网络摄像头的图像 使用 OpenCV DirectShow 无 VFW http opencv willowgarage com wiki CameraCapture http opencv willow
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域
  • OpenCV 2.2 和多 CPU - opencv_haartraining.exe 是多线程的吗?

    我在 VS 2010 上构建了 OpenCV 2 2 启用了 TBB 3 支持 我确保所有项目都有正确的 tbb lib 目录 并将 tbb lib 列为依赖项 通过隐藏 tbb dll 进行验证 果然 haartraining exe 抱
  • VideoCapture.read() 返回过去的图像

    我在跑python3 6 with openCV on the Raspberry pi OS is Raspbian 代码的大致结构如下 The image以时间间隔 3 5 分钟 捕获 被捕获image在函数中处理并返回度量 精度的种类
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 如何将多行文本插入到框架/图像中

    我使用 C 和 OpenCV 创建了一个框架 并想在其中插入几行文本 使用以下代码 putText frame My text here cvPoint 30 30 FONT HERSHEY COMPLEX SMALL 0 8 cvScal
  • 查找具有不同强度/亮度的相似图像

    假设我有如下图像 我可以选择什么来比较两个图像之间的相似度 显然它们是相同的图像 只是亮度不同 我找不到任何可行的方法 目前我最好的选择是训练 cnn 或自动编码器并比较输出的特征向量 但这似乎有点矫枉过正 任何提示将不胜感激 相当强大的工
  • 找到 4 个特定的角像素并将它们与扭曲透视一起使用

    我正在使用 OpenCV 我想知道如何构建一个简单版本的透视变换程序 我有一张平行四边形的图像 它的每个角都由具有特定颜色的像素组成 该像素在图像中没有其他位置 我想遍历所有像素并找到这 4 个像素 然后我想将它们用作新图像中的角点 以扭曲
  • 使用 OpenCV 进行相机校准 - 如何调整棋盘方块大小?

    我正在使用 OpenCV Python 示例开发相机校准程序 来自 OpenCV 教程 http opencv python tutroals readthedocs io en latest py tutorials py calib3d
  • C++ OpenCV 3.4 / FFMPEG 3.4.1 VideoWriter 和 MP4 输出文件格式

    我正在运行 Linux 内核 4 9 35 ti r44 的 ARM BeagleBone X 15 Debian 机器 在我的 C Qt 5 应用程序中 我想将 cv Mat 帧保存为 MP4 格式视频 我安装了 libx264 并从头开
  • OpenCV Sobel 滤波器 - 为什么它看起来这么糟糕,尤其是与 Gimp 相比?

    我正在尝试使用 OpenCV 重建一些我之前在 Gimp 中完成的预处理 第一级是用于边缘检测的 Sobel 滤波器 它在 Gimp 中运行得很好 现在这是我对 OpenCV 的尝试 opencv imgproc Sobel src sca
  • 尝试使使用 OpenCV 的 java 应用程序(可执行 Jar)可移植。出现不满意的链接错误

    我制作了一个应用程序 用于从网络摄像头抓取视频并使用 OpenCV 和 JavaCV 检测运动 我正在尝试使用 eclipse 导出为可执行 jar 该程序在 eclipse 中运行良好 就像我编写该程序的计算机上的 exe jar 一样
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 使用 Racket FFI 进行快速阵列访问

    我正在尝试在 Racket 中编写 OpenCV FFI 并达到了需要有效操作数组的地步 然而 我所有使用 Racket FFI 访问数组的尝试都会导致代码效率非常低 有没有办法使用 FFI 快速访问 C 数组 在 Racket 中 这种类
  • 从基本矩阵中查找单应矩阵

    我正在尝试计算单应性矩阵H给定一组对应关系和基本矩阵F 根据对极几何原理 我知道这可以通过对极线和对极线的叉积来完成F from 极点几何 http www cs unc edu marc tutorial node44 html e ij
  • 使用 OpenCV 从轮廓获取掩模

    我想从我通过 cv findContours 计算的轮廓 它只存在 1 个轮廓 获取图像掩模 然而 虽然我的轮廓变量不为空 但我无法使用 cv drawContours 检索图像蒙版 我的目标图像始终为空 这是我的代码 img mosaic

随机推荐

  • Materials Studio工具模块介绍

    相关教程和破解版软件包下载链接为 https blog csdn net qwxwaty article details 80402505 各模块细节介绍 Materials Visualizer Materials visualizer
  • 总结ctf中 MD5 绕过的一些思路

    总结ctf中 MD5 绕过的一些思路 1 常规的0e绕过 2 数组绕过 3 强类型绕过 4 a md5 a 5 md5 与SQL注入 a b md5 a md5 b sha1 a sha1 b 1 常规的0e绕过 QNKCDZO 24061
  • mapbox 在 vue2 中的使用

    一 Mapbox 在 vue 中的使用 安装 mapbox mapbox gl geocoder npm install save mapbox mapbox gl geocoder 安装 mapbox mapbox gl language
  • (三)原生JavaScript----Ajax的Get请求和Post请求

    三 原生JavaScript使用Ajax的步骤 Router js中有get post接口 一 定义一个ajax函数 const ajax function 二 获取节点值 Ajax函数中 let username document get
  • golang时间-时间戳的获取-转换-计算

    一 获取时间 1 1 获取当前时间 代码实现 package main import fmt time func main currentTime time Now 当前时间 currentYear time Now Year 当前年 cu
  • 浅谈Spring

    Spring是一个轻量级的控制反转 IoC 和面向切面 AOP 的容器 框架 一 什么是IOC IoC Inversion of Control 翻译成中 是 控制反转 的意思 也就是说 Spring 是 个 控制反转 的容器 1 1控制反
  • python可视化学习七(边缘箱型图)

    边缘箱线图 箱图是用来显示变量分布的统计图 直方图更看重与在取值范围内的分布 而箱线图更看重于观察变量间的重要分割点 箱线图能够显示数据分布的关键数据的节点 常用来作为查找异常值的方式 1当直方图的分布越接近正态分布 箱线图就会越对称 2直
  • 栈区,堆区,全局区,文字常量区,程序代码区 详解

    原博地址 http blog csdn net yitian20000 article details 6358837 感觉这篇文章讲的很清晰 很详细 一 预备知识 程序的内存分配 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈
  • typora用户指南

    Typora 一直是我认为桌面端笔记应用应有的终极形态 用我之前 一篇文章 中的话来说就是 它的功能之强大 设计之冷静 体验之美妙 理念之先进 我认为值得所有笔记应用厂商学习 但一件很尴尬的事情是 由于它极简的设计理念 有许多使用者并没能完
  • liunx ftp 421 passive mode refused([linux]配置 vsftp 启用被动模式(passive mode)解决客户端“no route to host“错误)

    系统 CentOS 修改 vsftpd conf 启用被动模式 指定端口 pasv min port 12000 pasv max port 12199 pasv enable YES 配置防火墙 iptables 允许端口访问 iptab
  • vue2项目(二)---Header、Footer

    非路由组件 Header Footer 首页 搜索页 路由组件 Home首页 Search搜索 login登录 无Footer register注册 无Footer 开发项目的步骤 1 书写静态页面 HTML CSS 2 拆分组件 路由 非
  • 华为机试:敏感字段加密

    题目来源 华为机试 敏感字段加密 题目描述 题目解析 要求 删除命令字前后多余的下换线 对指定索引的敏感字段进行加密 替换为 无法找到指定索引的命令字 输出字符串ERROR 分析 如果遇到大小写字母 数字 这一定是密码 可能需要替换成6个
  • Qt 使用共享库

    创建动态库工程 选择模块需要注意的是如果想要将GUI封装成一个动态库 那么必须要要将QtWidgets选中 不然是不能生成ui xxx h头文件的 接下来直接都下一步直到创建好就好 创建好之后会有两个头文件 一个 cpp文件 Global
  • 数据清洗遇到的问题思考

    因为本次任务是基础的数据预处理和数据集划分 所以本次讨论不涉及特征工程和模型相关的 问题一 缺失数据 有很多人问到了缺失值处理的问题 统一汇总提问 为什么需要处理缺失值 确实值会影响模型训练 某些特征值确实 有可能使得该条样本完全是负样本
  • VM6289:1 http://xxx.cn 不在以下 request 合法域名列表中,请参考文档:https://developers.weixin.qq.com/miniprogra

    本地测试时 点击微信开发工具右上角详情 然后勾选上 不校验合法域名
  • SpringSecurity学习笔记(十二)异常以及权限管理使用

    参考视频 异常 SS中的异常主要分为两种 AuthenticationException authenticationException 认证异常 AccessDeniedException accessDeniedException 授权
  • Django—模板层

    目录 常用语法 变量 模板语法之注释 模板语法之过滤器 常见的django过滤器 模板语法之标签 自定义过滤器 标签和inclusion tag 自定义过滤器 模板的继承 常用语法 变量相关 逻辑相关 模板语法传值支持python的所有基本
  • C#中把中文转换成对应的拼音码

    using System using System Data using System Configuration using System Web using System Web Security using System Web UI
  • ChatGPT生成的介绍Easy发票查验软件的文案!说到我的心坎里了!

    该软件是一款专为企业用户设计的发票处理工具 它拥有多种功能 包括发票图片矫正 发票识别 发票重命名 发票查验和发票打印等 可极大地提高企业的发票处理效率 首先 该软件的发票图片矫正功能可以自动调整图片的角度和大小 确保图片能够清晰地被识别
  • opencv与C++实现最大类间方差法(OTSU)进行图像二值化

    直接上代码 使用最大类间方差法进行二值化的函数 void threshold otsu Mat mat Mat mat thresh mat为输入图像 mat thresh为二值化后的输出图像 求出图像的最大和最小像素值 确定阈值区间 do