opencv c++ 二值图像、阈值计算方法、全局阈值、自适应阈值

news2024/9/30 5:38:20

1、图像定义:

彩色图像 :三通道,像素值一般为0~255;

灰度图像:单通道,像素值一般为0~255;

二值图像:单通道,像素值一般为0(黑色)、255(白色);

彩色图像颜色范围查询表:

2、图像阈值分割方法

设原图的像素值分布为如下红色区域,蓝色的线表示像素值阈值T。

2.1、二值分割

a)大于阈值T的像素点置满保留,其余置0。b)小于阈值T的像素点置满保留,其余去除。

         

2.2、其余阈值图像分割方法

a)大于阈值T的像素点值置为阈值。          b)小于阈值T的像素点值置0。

         

c)大于阈值T的像素点值置0。

 API

threshold(灰度图, 输出图像, 阈值, 图像最大像素值, 阈值分割方法);

阈值分割方法:

 2.3、代码:

void QuickDemo::zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	namedWindow("gray", WINDOW_FREERATIO);
	imshow("gray", gray);
	Mat binary;
	threshold(gray, binary, 127, 255, THRESH_BINARY);
	namedWindow("THRESH_BINARY", WINDOW_FREERATIO);
	imshow("THRESH_BINARY", binary);
	threshold(gray, binary, 127, 255, THRESH_BINARY_INV);
	namedWindow("THRESH_BINARY_INV", WINDOW_FREERATIO);
	imshow("THRESH_BINARY_INV", binary);
	threshold(gray, binary, 127, 255, THRESH_TRUNC);
	namedWindow("THRESH_TRUNC", WINDOW_FREERATIO);
	imshow("THRESH_TRUNC", binary);
	threshold(gray, binary, 127, 255, THRESH_TOZERO);
	namedWindow("THRESH_TOZERO", WINDOW_FREERATIO);
	imshow("THRESH_TOZERO", binary);
	threshold(gray, binary, 127, 255, THRESH_TOZERO_INV);
	namedWindow("THRESH_TOZERO_INV", WINDOW_FREERATIO);
	imshow("THRESH_TOZERO_INV", binary);
}

 3、阈值计算方法

        在图像阈值分割时,需要选取一个合适的阈值,基本分为全局阈值自适应阈值两大类。

3.1 全局阈值法

        均值法:统计图像像素值的均值作为阈值。

void zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Scalar m = mean(gray);
	//printf("means : %2f\n", m[0]);

	Mat binary;
	threshold(gray, binary, m[0], 255, THRESH_BINARY);
	namedWindow("THRESH_BINARY", WINDOW_FREERATIO);
	imshow("THRESH_BINARY", binary);
}

        OTSU法(基于最小类内方差求阈值的方法):基于像素直方图的统计结果,统计各像素点值的方差值,选类内方差最小的像素点值作为阈值。

        如下对像素点值为2的像素点求类内方差的过程:

       a)分别 计算该像素点值左边、右边的比重,均值,方差。

         b)计算类内方差:

        

void QuickDemo::zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	namedWindow("gray", WINDOW_FREERATIO);
	imshow("gray", gray);
	
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY|THRESH_OTSU);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);
}

      Triangle法:获取如下直方图后,从最高点到最低点作一线段,以α和β为45°为前提,寻找右图上使得d最大的线段,将此时α角点的像素点值作为阈值。

        注:在常规操作时,为了使得像素点值不过于靠近最多的像素点值,常常将其向右偏移20%的总像素距离。

void QuickDemo::zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	namedWindow("gray", WINDOW_FREERATIO);
	imshow("gray", gray);
	
	Mat binary;
	threshold(gray, binary, 0, 255, THRESH_BINARY|THRESH_TRIANGLE);
	namedWindow("THRESH_OTSU", WINDOW_FREERATIO);
	imshow("THRESH_OTSU", binary);
}

 

        适用情况总结:OTSU法适用于有多峰直方图的图像,三角法使用有单峰直方图的图像。

 3.2、自适应阈值

        采用卷积的方式,对图像逐个窗口的中心像素点值进行阈值处理,此时的每个窗口的阈值方法有窗口均值阈值法、高斯分布阈值法。

        API:

CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
                                     double maxValue, int adaptiveMethod,
                                     int thresholdType, int blockSize, double C );

maxValue ——赋予给满足条件的像素的非零值。
AdaptiveMethod ——要使用的自适应阈值算法, 如下:


thresholdType ——阈值分割方法,这里只能使用THRESH_BINARY等方法,不能使用OTSU法。
blockSize——用于计算像素阈值的像素邻域的大小:3、5、7 等。
C ——计算后均值被减去的值,如 threshvalure - C,C常为正数

 代码:

void QuickDemo::zero_one_img(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	namedWindow("gray", WINDOW_FREERATIO);
	imshow("gray", gray);
	
	Mat binary;
	adaptiveThreshold(gray, binary, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY,3,0);
	namedWindow("adaptiveThreshold", WINDOW_FREERATIO);
	imshow("adaptiveThreshold", binary);
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python计算器(包含机制转换)

实现思路: 要优先处理内层括号运算--外层括号运算--先乘除后加减的原则: 1、正则处理用户输入的字符串,然后对其进行判断,判断计算公式是否有括号,有就先将计算公式进行…

判断二叉树是否是平衡二叉树(c#)

问题描述 给定一棵二叉树,判断其是否为平衡二叉树。 示例 示例1 Input: root [3,9,20,null,null,15,7] Output: true 示例2 Input: root [1,2,2,3,3,null,null,4,4] Output: false 解决方案描述 二叉树的每个节点的左子节点和右子节点的高度差小于等于1&#x…

Windows和Linux混合系统通过AD域实现用户集中认证

一、Windows AD域 1、统一认证简介 管理的Linux服务器和Windows服务器如果很多,如果都用本地用户名管理,要管理和记住几十台甚至上百台服务器的不同账号不同密码,这是很难的。但是如果所有服务器账号密码都设置一样,那又完全没有安全性可言。 什么是服务器的集中认证(统…

数据结构(8)树形结构——B树、B+树(含完整建树过程)

目录 8.1.B树 8.1.1.概述 8.1.2.完整建树过程 8.2.B树 8.1.B树 8.1.1.概述 B树存在的意义: 二叉树在存储数据时可能出现向一边倾斜导致查询效率降低的情况,为了防止二叉树的倾斜,出现了平衡二叉树,通过旋转的方式保证二叉树…

[附源码]计算机毕业设计springboot校园商铺

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]Python计算机毕业设计Django基于web的羽毛球管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

学生HTML个人网页作业作品 HTML+CSS+JavaScript环保页面设计与实现制作

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

【PPT计时器】如何在wps演示PPT中使用定时器、计时器功能?不使用第三方插件,仅仅使用第三方计时器软件

一、问题背景和解决思路 很多人在展示PPT时,有精确的时间要求,比如五分钟,十分钟。 这时候,我们希望在演示的时候,PPT上附带一个小计时器、或者定时器。 网上有很多加定时器动画的教程,大多数停留在动画…

【D3.js】1.15-反转 SVG 元素

title: 【D3.js】1.15-反转 SVG 元素 date: 2022-12-02 14:07 tags: [JavaScript,CSS,HTML,D3.js,SVG] 文章目录一、学习目标二、题目三、通关代码参考更新svg坐标的y轴是在顶部的,即画出来的rect也是底朝上,如何让rect的底处于底部呢?一、学…

【C++初阶】STL-string的使用

文章目录一.string初识1.STL简介a.STL的组成b.STL和string的关系2.basic_string二.构造函数三.三种遍历方式四.容量相关的函数1.size()2.reserve()–调整容量3.resize()–调整size五.字符串的增删查改1.assign2.replace3.find()4.substr()5.insert()6.相关应用a.替换空格:b.取出…

【Redis-08】面试题之Redis数据结构与对象-RedisObject(上篇)

Redis本质上是一个数据结构服务器,使用C语言编写,是基于内存的一种数据结构存储系统,它可以用作数据库、缓存或者消息中间件。 我们经常使用的redis的数据结构有5种,分别是:string(字符串)、list(列表)、hash(哈希)、s…

string类的模拟实现

目录 一、浅拷贝、深拷贝 二、传统版本写法的String类 三、现代版本写法的String类 四、String类的模拟实现 一、浅拷贝、深拷贝 构造 //构造函数String(const char* str ""){if (nullptr str){assert(false);return;}_str new char[strlen(str) 1];strcpy(_s…

使用 Pandas 和 SQL 进行实用数据分析,让我们用 pandas 和 SQL 进行数据分析并实际理解它们(教程含数据csv)

Pandas是一种快速、强大、灵活且易于使用的开源数据分析和操作工具, 构建于 Python 编程语言之上。 SQL代表结构化查询语言。SQL 允许您从 RDBMS(关系数据库管理系统)访问数据,并可用于数据分析。 Pandas 和 SQL 都广泛用于数据分析。 在这篇博客中,我们将使用pandas和…

做好自己安全第一责任人 嘀嗒全面上线安全带智能语音提醒

2022年12月2日是第十一个“全国交通安全日”,今年主题为“文明守法 平安回家”。 当天,嘀嗒出行启动主题为“共建三方安全观,安全要靠你我他”共塑行动,倡导平台、用户、行业各方形成合力,共塑共创安全文明的新出行之路…

简单的PCI总线INTx中断实现流程

一个简单的PCI总线INTx中断实现流程,如下图所示。 1. 首先,PCI设备通过INTx边带信号产生中断请求,经过中断控制器(Interrupt Controller,PIC)后,转换为INTR信号,并直接发送至CPU; 2. CPU收到INTR信号置位后,意识到了中断请求的发生,但是此时并不知道是什么中断请求…

记一次 .NET 某电子厂OA系统 非托管内存泄露分析

一:背景 1.讲故事 这周有个朋友找到我,说他的程序出现了内存缓慢增长,没有回头的趋势,让我帮忙看下到底怎么回事,据朋友说这个问题已经困扰他快一周了,还是没能找到最终的问题,看样子这个问题…

hyper-v 虚拟机与本机之间 sftp实现文件传输

hyper-v 主打安全性,所以跟VMware不一样,不能实现复制粘贴:文字、文件、文件夹,所以采取了折中的办法,在Windows主机端用power shell,sftp命令进行文件传输。 前提 需要安装并能够正常运行ssh,后…

C++实现彩色bmp图片转灰度图

简介 BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了…

第05章_存储引擎

第05章_存储引擎1. 查看存储引擎2. 设置系统默认的存储引擎3. 设置表的存储引擎3.1 创建表时指定存储引擎3.2 修改表的存储引擎4. 引擎介绍4.1 InnoDB 引擎:具备外键支持功能的事务存储引擎4.2 MyISAM 引擎:主要的非事务处理存储引擎4.3 Archive 引擎:用于数据存档4.4 Blackhol…

认真过一遍webpack

1. 简介 Webpack 是 前端资源打包工具,它会根据模块之间的依赖关系进行静态分析,将模块按照指定的规则生成对应的静态资源。 webpack会从入口文件开始打包,先形成依赖关系图,根据依赖图把不同的资源引进来形成一个chunk代码块&a…