opencv阈值图像Threshold方法

news2024/11/26 18:54:34

图像阈值

固定阈值,自适应阈值,Otsu 二值化等
全局阈值和局部阈值
一、图像二值化
定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。

灰度值0:黑,灰度值255:白

一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。

二、固定阈值

与名字一样,这种方法非常简单。但像素值高于阈值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。这个函数就是:

threshold(img, threshold, maxval,type)

参数解释:
img就是原图像,原图像应该是灰度图
threshold是设定的阈值,就是用来对像素值进行分类的阈值
maxval是当灰度值大于(或小于)阈值时将该灰度值赋成的值
type规定的是当前二值化的方式
OpenCV提供了多种不同的阈值方法,这是有第四个参数来决定的。这些方法包括:

THRESH_BINARY
二值化阈值,大于阈值的部分被置为255,小于部分被置为0
THRESH_BINARY_INV
反向二值化阈值,大于阈值部分被置为0,小于部分被置为255
THRESH_TRUNC
截断阈值化,大于阈值部分被置为threshold,小于部分保持原样
THRESH_TOZERO
小于阈值部分被置为0,大于部分保持不变
THRESH_TOZERO_INV
大于阈值部分被置为0,小于部分保持不变

三、自适应阈值

在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果。

在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。

自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处:

每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。

亮度较高的图像区域的二值化阈值通常会较高,而亮度低的图像区域的二值化阈值则会相适应的变小。

不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。

适合处理光照不均的图像。

adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType, bolckSize, C)

Adaptive Method 指定计算阈值的方法。

ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
thresholdType 指定阈值类型。可选择THRESH_BINARY或者THRESH_BINARY_INV两种。(即二进制阈值或反二进制阈值)

Block Size 邻域大小(用来计算阈值的区域大小),一般选择为3、5、7…等。

C 参数C表示与算法有关的参数,阈值就等于的平均值或者加权平均值减去这个常数,可以是负数。

自适应阈值化计算过程

自适应阈值化计算大概过程是为每一个象素点单独计算的阈值,即每个像素点的阈值都是不同的,就是将该像素点周围B*B区域内的像素加权平均,然后减去一个常数C,从而得到该点的阈值。

  • ADAPTIVE_THRESH_MEAN_C,为局部邻域块的平均值,该算法是先求出块中的均值,再减去常数C。
  • ADAPTIVE_THRESH_GAUSSIAN_C,为局部邻域块的高斯加权和。该算法是在区域中(x, y)周围的像素根据高斯函数按照他们离中心点的距离进行加权计算,再减去常数C。
    1
    2
    例子(参考博客)

如果使用平均值方法,平均值mean为190,差值delta(即常数C)为30。那么灰度小于160的像素为0,大于等于160的像素为255。

二值化:
在这里插入图片描述

反向二值化:
在这里插入图片描述

四、Otsu二值化

在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答案就是不停的尝试。如果是一副双峰图像(简单来说双峰图像是指图像直方图中存在两个峰)呢?我们岂不是应该在两个峰之间的峰谷选一个值作为阈值?
在这里插入图片描述

#include <opencv.hpp>
#include<iostream>
#include <string>
#include<conio.h>
#include<time.h>
using namespace std;
using namespace cv;

Mat src, gray_src, dst;
int threshold_value=227;
int threshold_max = 255;
int type_value = 2;
int type_max = 5;
 const char* output_title = "binary image";
void PrintMs(const char* text = "")
{
	static long long last = 0;
	long long cur = getTickCount();
	if (last == 0)
	{
		last = cur;
		return;
	}

	long long ms = 0;
	ms = ((double)(cur - last) / getTickFrequency()) * 1000;
	if (*text != 0)
	{
		printf("%s=%dms\n", text, ms);
		printf("\n");
	}
	last = getTickCount();
}
void THreshhold_Demo(int ,void *)
{
	cvtColor(src, gray_src, COLOR_BGR2GRAY);
	//threshold(gray_src, dst, threshold_value, threshold_max,type_value);
	//自动计算阈值
	threshold(gray_src, dst, 0, 255, THRESH_OTSU|type_value);
	//通过TRIANGLE计算得到
	//threshold(gray_src, dst, 0, 255, THRESH_TRIANGLE | type_value);


	imshow(output_title, dst);
}
int main()
{
	 src = imread("E:\\Users\\opencvCoder\\image\\niu.jpg",1);
	//Mat result = src.clone();
	 namedWindow("input image", WINDOW_AUTOSIZE);
	 imshow("input image", src);
	 namedWindow(output_title, WINDOW_AUTOSIZE);

	createTrackbar("Threshold Value:",output_title, &threshold_value, threshold_max, THreshhold_Demo);
	createTrackbar("Type Value:", output_title, &type_value, type_max, THreshhold_Demo);

	THreshhold_Demo(0, 0);
	
	waitKey(0);
	return 0;


}

OTSU自适应阈值方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
typeValue=2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

热门Java开发工具IDEA入门指南——导出项目到Eclipse

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 上文…

打工人,这里有一份述职技巧,请查收

大家好&#xff0c;马上到年底了&#xff0c;有多少小伙伴正在期待着述职邮件&#xff0c;毕竟收到述职邮件&#xff0c;也就意味着有机会升职加薪。有没有跟糖糖一样&#xff0c;没收到邮件的&#xff1f; 工作要善于总结&#xff0c;也要善于表达&#xff0c;如何在限时内将…

跨平台应用开发进阶(四十)自定义插件及引用

文章目录一、前言二、插件制作三、离线插件集成应用示例四、拓展阅读一、前言 正如将可复用功能封装为自定义组件以供他人使用一样&#xff0c;在uni-app开发框架中提供了另一种形式的自定义插件&#xff0c;并可将该插件提交至uni-app插件市场。 二、插件制作 制作插件前&a…

前端 单元测试介绍 - 以及在项目中使用 (史上最全)

前言 我们前端开发过程中&#xff0c;编写测试代码&#xff0c;有以下这些好处&#xff1a; 更快的发现bug&#xff0c;让绝大多数bug在开发阶段发现解决&#xff0c;提高产品质量 比起写注释&#xff0c;单元测试可能是更好的选择&#xff0c;通过运行测试代码&#xff0c;观…

ARM 异常处理方式简单介绍

一、什么是异常 正常工作之外的流程都叫异常&#xff1b; 也就是说&#xff0c;除了用户模式和系统模式外&#xff0c;其他情况都是异常&#xff0c;见下图&#xff1a; 异常会打断正在执行的工作&#xff0c;并且一般我们希望异常处理完成后继续回来执行原来的工作&#xff…

3-azido-1-Propanamine,88192-19-2,3-叠氮基丙胺 性质特点有哪些?

●中文名&#xff1a;3-叠氮基丙胺&#xff0c;3-叠氮基-丙胺 ●英文名&#xff1a;3-azido-1-Propanamine ●外观以及性质&#xff1a; 西安凯新生物科技有限公司供应的&#xff1a;​3-azido-1-Propanamine为淡黄色或无色油状&#xff0c;含有叠氮基团&#xff0c;叠氮基可以…

Node.js 入门教程 23 使用 npm 的语义版本控制 24 卸载 npm 软件包 25 npm 全局或本地的软件包

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程23 使用 npm 的语义版本控制24 卸载 npm 软件包25 npm 全局或本地的软件包23 使用 npm 的语义版本控制 如果 Node.js 软件…

第147篇 笔记-预言机(Oracle)

定义&#xff1a;区块链预言机是将区块链连接到外部系统的实体&#xff0c;从而使智能合约能够基于现实世界的输入和输出执行。 预言机为分散的 Web3 生态系统提供了一种访问现有数据源、遗留系统和高级计算的方式。去中心化预言机网络&#xff08;DON&#xff09;支持创建混合…

[附源码]计算机毕业设计springboot“小世界”私人空间

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

Java学历、技术哪个更重要?学历不好还能进大厂吗?

Java程序员的入行门槛并不高&#xff0c;并不看重你的学历和其他各方面&#xff0c;唯一看重的就是你技术是否过硬&#xff0c;能否独立参与到企业级开发的项目中去&#xff0c;说简单点入行只看技术。但是你如果想要长远发展服日后走上管理岗位&#xff0c;最好还是自考个本科…

使用 SwiftUI 构建可搜索列表,为您的 iOS 应用程序创建具有自动完成功能的可搜索列表(教程含源码)

设计新应用程序时面临的一大挑战是确保您的用户可以轻松浏览内容。如果体验太难或花费太多时间,无论您的内容有多好,很多用户都会转向另一个应用程序选项或放弃。 期望用户滚动浏览一长串选项是不切实际的,添加搜索功能可以极大地改善用户体验。更进一步,在用户键入时让列…

2.RabbitMQ安装

2.RabbitMQ安装 注意&#xff1a;安装时使用的系统是CentOS-7,MQ基本概念和RabbitMQ的相关知识请查看写的文章。 1、安装依赖环境 在线安装依赖环境&#xff1a; yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel…

17、Health Check 健康检查

强大的自愈能力是kubernetes容器编排引擎的重要特性。自愈的默认实现方式是自动重启发生故障的容器。除此之外&#xff0c;还可通过Liveness和Readiness探测机制设置更精细的健康检查&#xff0c;进而实现如下要求&#xff1a;零停机部署避免部署无效的镜像更加安全的滚动升级一…

有没有免费的视频剪辑软件?快来看看这些视频裁剪软件

我们有时候将视频拍好后&#xff0c;会觉得视频中有些画面的边缘出现了瑕疵&#xff0c;就想要将那些边缘裁剪掉&#xff0c;但是却不知道要怎么操作才能裁剪视频的画面。其实想要裁剪视频的画面很简单&#xff0c;我们只需要借助一些视频处理工具就可以实现裁剪视频画面的操作…

Swift 周报 第十八期 |技术汇总

前言 本期是 Swift 编辑组自主整理周报的第九期&#xff0c;每个模块已初步成型。各位读者如果有好的提议&#xff0c;欢迎在文末留言。 欢迎投稿或推荐内容。目前计划每两周周一发布&#xff0c;欢迎志同道合的朋友一起加入周报整理。 蝴蝶的生命之所以如此短暂&#xff0c…

解决git中出现的“fatal ‘xxxx‘ does not appear to be a git repository”错误的方法

今天来分享一下我在使用git中出现的一个错误提示&#xff0c;话不多说&#xff0c;我们直接来分析~ 这个错误是我在通过SSH方式pull远程仓库时候出现的&#xff0c;错误提示如下&#xff1a; fatal: xxx(你的仓库别名) does not appear to be a git repository fatal: Could n…

【C++学习】string的模拟实现

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 上篇文章中本喵介绍了C标准库中string类的使用&#xff0c;下面本喵来模拟实现一下string类。库中的s…

【Spring框架】爆gan两万六千字,助你通关IoC和DI

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;【Spring】 &#x1f96d;本文内…

navicat连接mysql数据库

一、打开navicat软件 二、创建一个测试连接 1、点击【连接】&#xff0c;选择【MySQL】 2、创建连接。 3、连接出现报错 三、解决方式&#xff1a; 1、键盘上wins r 同时按&#xff0c;输入cmd&#xff0c;调出命令行窗口。 2、通过cmd登陆mysql 3、输入以下语句修改密码 更…

拿下50亿后,岚图能否一绘蓝图?

近两年&#xff0c;我国新能源汽车市场呈现出一派百家争鸣、高歌猛进的势头。2021年&#xff0c;A股新能源汽车指数全年上涨42.72%&#xff0c;大幅跑赢沪深300、中证500和汽车指数。 然而进入2022年寒冬&#xff0c;新能源汽车市场却集体打了个“哆嗦”。 美股特斯拉自今年4…