06 OpenCV 阈值处理、自适应处理与ostu方法

news2024/11/17 12:36:37

1 基本概念

CV2中使用阈值的作用是将灰度图像二值化,即将灰度图像的像素值根据一个设定的阈值分成黑白两部分。阈值处理可以用于图像分割、去除噪声、增强图像对比度等多个领域。例如,在物体检测和跟踪中,可以通过对图像进行阈值处理来提取目标区域;在图像增强中,可以使用阈值处理来增强图像的轮廓和细节等。
阈值处理可以使用cv2.threshold()函数来完成。

retval, dst = cv2.threshold(src, thresh, maxval, type)

其中,参数解释如下:

  • src:输入图像,可以是灰度图像或彩色图像。
  • thresh:设定的阈值。
  • maxval:二值化后的最大值。当typecv2.THRESH_BINARYcv2.THRESH_BINARY_INV时,像素值大于阈值的部分会设置为maxval,否则会设置为0。
  • type:二值化操作的类型,包括:
    • cv2.THRESH_BINARY:二值化操作,大于阈值的像素值设置为maxval,小于等于阈值的像素值设置为0。
    • cv2.THRESH_BINARY_INV:反向二值化操作,大于阈值的像素值设置为0,小于等于阈值的像素值设置为maxval
    • cv2.THRESH_TRUNC:截断操作,大于阈值的像素值设置为阈值,小于等于阈值的像素值保持不变。
    • cv2.THRESH_TOZERO:像素值小于等于阈值的设置为0,大于阈值的保持不变。
    • cv2.THRESH_TOZERO_INV:像素值大于等于阈值的设置为0,小于阈值的保持不变。

cv2.threshold()函数的返回值为一个元组,包括:

  • retval:实际使用的阈值。
  • dst:二值化后的输出图像。

2 二值化处理

灰度图像

通过对灰度图像进行二值处理,可以在图形中只保留两种颜色,通常我们设定为255(白色)和0(黑色),但也可根据需求设置为黑色和灰色的二值图像,如:

import cv2  
img = cv2.imread("lenacolor.png", 0)  # 将图像读成灰度图像  
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 二值化阈值处理  
t2, dst2 = cv2.threshold(img, 127, 200, cv2.THRESH_BINARY)  
cv2.imshow('img', img)  
cv2.imshow('dst1', dst1)  
cv2.imshow('dst2', dst2)  
cv2.waitKey()  
cv2.destroyAllWindows()

image.png

彩色图像

同样这一方法可用于彩色图像,通过对某一通道进行二值化,使图像的颜色变得更加夸张,如:

import cv2  
  
img = cv2.imread('lenacolor.png')  
b, g, r = cv2.split(img)  # 将BGR通道分离  
  
# 对红色通道进行阈值处理  
t1, r = cv2.threshold(r, 127, 255, cv2.THRESH_BINARY)  
  
img_after = cv2.merge([b, g, r])  
  
cv2.imshow('original', img)  
cv2.imshow('threshold', img_after)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

image.png

反二值化处理

反二值化处理(Inverse Thresholding)是二值化处理的一种变体,其作用是将灰度图像的像素值根据一个设定的阈值分成两部分,但是与普通二值化处理不同的是,反二值化处理将像素值大于阈值的部分设置为0,小于等于阈值的部分设置为最大像素值,即产生一个反色的二值化图像。代码中type需要设置为cv2.THRESH_BINARY_INV

防止视觉疲劳,后面的图换了一下示例图像

3 零处理

低于阈值零处理

低于阈值的部分会被处理为0,此时填入的maxval无效
对灰度图来说,低于阈值的部分将会被处理为黑色;对于RGB彩图来说,低于阈值的部分图像会变暗。

import cv2  
img1 = cv2.imread("test.png", 0)  # 将图像读成灰度图像  
img2 = cv2.imread("test.png")  
  
b, g, r = cv2.split(img2)  # 将BGR通道分离  
  
t1, dst1 = cv2.threshold(img1, 127, 255, cv2.THRESH_TOZERO)  # 低于阈值零处理  
cv2.imshow('img1', img1)    
cv2.imshow('dst1', dst1)    
  
t2, b = cv2.threshold(b, 127, 255, cv2.THRESH_TOZERO)  # 低于阈值零处理  
img_after = cv2.merge([b, g, r])  
cv2.imshow('img2', img2)  
cv2.imshow('img_after', img_after)    
  
cv2.waitKey()  
cv2.destroyAllWindows()

image.png

超出阈值零处理

类似反二值化处理。将超出某一阈值的部分进行归零处理。超出阈值零处理可以在一些特定的场合下使用,例如在一些需要保留一定程度的图像细节的场合,超出阈值零处理可以避免将过多的像素值直接设置为0或最大像素值,从而使图像保留更多的细节信息。

4 截断处理

该方法传入的type是cv2.THRESH_TRUNC,代码结构与前面高度重合,此处不再贴代码。
截断处理是二值化处理的一种变体,其作用是将灰度图像的像素值根据一个设定的阈值分成两部分,但是与普通的二值化处理不同的是,超出阈值的部分不会被设置为0或最大像素值,而是被截断为阈值本身。
图像截断处理通常适合用于需要保留图像主要信息的场合,而又不需要进行明显的二值化操作的场合。在这种情况下,截断处理可以使得图像保留更多的灰度级,从而能够更好地保留图像中的细节和信息,同时又能够去除一些噪声或者不需要的部分。

5 自适应处理

自适应阈值处理是图像处理中的一种常见操作,可以根据图像局部的灰度特征来自适应地确定阈值,以达到更好的二值化效果。在OpenCV中,可以使用cv2.adaptiveThreshold()函数进行自适应阈值处理。
相比于阈值处理,自适应处理具有以下优点:

  1. 自适应处理可以根据局部像素的灰度值特征来确定二值化阈值,从而适应图像的不同区域和不同光照条件,能够更好地突出图像中的目标物体。
  2. 自适应处理可以在处理过程中保留更多的细节信息,减少因阈值过大或过小而造成的信息丢失,提高图像处理的准确性。
  3. 自适应处理适用于复杂背景下的目标物体分割,特别是在背景区域灰度分布不均的情况下,能够更好地处理背景区域和目标区域的差异。

自适应处理相比于阈值处理具有更好的适应性和灵活性,可以在不同的图像处理场景中应用。当图像的灰度分布不均、光照条件不同或需要保留更多的细节信息时,自适应处理通常是更好的选择。

cv2.adaptiveThreshold()函数的基本语法如下:

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

其中:

  • src:输入图像,必须为灰度图像。
  • maxValue:二值化后的最大值。
  • adaptiveMethod:自适应阈值处理的方法,包括:
    • cv2.ADAPTIVE_THRESH_MEAN_C:基于均值的自适应阈值处理。
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:基于高斯加权平均值的自适应阈值处理。
  • thresholdType:阈值类型,与普通二值化处理相同,包括:
    • cv2.THRESH_BINARY:二值化操作,大于阈值的像素值设置为maxValue,小于等于阈值的像素值设置为0。
    • cv2.THRESH_BINARY_INV:反向二值化操作,大于阈值的像素值设置为0,小于等于阈值的像素值设置为maxValue
  • blockSize:每个像素点周围用来计算阈值的像素数。必须是奇数。
  • C:阈值校正值。该值会被加到均值或加权平均值上,用于调整阈值。

cv2.adaptiveThreshold()函数的返回值为二值化后的输出图像。

仍以上一张图像为例:

import cv2  
  
image_Gray = cv2.imread("test.png", 0)  
  
# 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_MEAN_C  
athdMEAM = cv2.adaptiveThreshold\  
    (image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 0)  
# 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_GAUSSIAN_C  
athdGAUS = cv2.adaptiveThreshold\  
    (image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 5, 0)  
# 显示自适应阈值处理的结果  
cv2.imshow("MEAN_C", athdMEAM)  
cv2.imshow("GAUSSIAN_C", athdGAUS)  
cv2.waitKey()  
cv2.destroyAllWindows()

image.png
可以看出自适应阈值似乎保留了更多细节,但此处效果并不好,也就说明自适应并不能完全代替人工选择。(对于人脸图像,该方法的效果会比上图更好一些)

6 Ostu方法

Otsu’s method 是一种经典的自适应阈值处理算法,可以自动确定图像的二值化阈值。该算法可以将图像中的像素值分为两部分,从而将图像转换为二值图像。在 OpenCV 中,可以使用cv2.threshold()函数进行 Otsu’s method 处理。在type中,输入对应的方法名+cv2.THRESH_OTSU即可调用该方法。该方法的存在也是threshold将阈值作为返回值的意义所在。
在 Otsu’s method 中,不需要预先指定阈值,而是通过计算图像灰度直方图和类间方差来确定阈值。具体来说,该方法会计算每一个像素灰度值作为阈值时,将图像分为前景和背景两部分的类间方差,然后选取类间方差最大的像素灰度值作为二值化阈值。

import cv2

img = cv2.imread('test.png', 0)
ret, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

cv2.imshow('original', img)
cv2.imshow('Otsu threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

image.png

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

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

相关文章

更专业、安全、可控!政企都选择WorkPlus私有化部署

现如今政企机构在信息化建设的过程中,内部的沟通协作都离不开即时通讯软件。但大多数企业使用的即时通讯软件都是Saas部署的,虽然使用Saas部署产品成本低,又方便快捷,但还是建议企业有条件最好使用私有化部署的即时通讯软件&#…

ERP是什么?中小商户有必要用吗?秦丝、金蝶、管家婆哪家强?

ERP系统刚开始传入中国的时候,基本上只有超大型或大型企业有条件实施,不过最近几年随着小微企业、中小商户的信息化需求不断增长,ERP软件已慢慢被普遍使用。但是仍然有不少中小商户,还没搞清楚ERP到底是什么,看到大家都…

【LeetCode】每日一题(5)

题目&#xff1a;2341. 数组能形成多少数对 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; class Solution { public:vector<int> numberOfPairs(vector<int>& nums) {} }; 解题思路&#xff1a; 做了一个星期的每日一题&#xff0c;终于…

自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲

自动驾驶&#xff1a;BEV开山之作LSS&#xff08;lift,splat,shoot&#xff09;原理代码串讲前言Lift参数创建视锥CamEncodeSplat转换视锥坐标系Voxel Pooling总结前言 目前在自动驾驶领域&#xff0c;比较火的一类研究方向是基于采集到的环视图像信息&#xff0c;去构建BEV视角…

疑似45亿地址信息泄露事件跟进后续

开放隐私计算 收录于合集#数据安全13个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区…

重生之我是赏金猎人-漏洞挖掘(十一)-某SRC储存XSS多次BypassWAF挖掘

0x01&#xff1a;利用编辑器的超链接组件导致存储XSS 鄙人太菜了&#xff0c;没啥高质量的洞呀&#xff0c;随便水一篇文章吧。 在月黑风高的夜晚&#xff0c;某骇客喊我起床挖洞&#xff0c;偷瞄了一下发现平台正好出活动了&#xff0c;想着小牛试刀吧 首先信息收集了一下&a…

【ns-3】零基础安装教程

文章目录前言1. 安装虚拟机及Ubuntu2. 安装依赖库3. 下载ns-34. 构建ns-3前言 近期因工作需要开始接触ns-3。作者零基础&#xff0c;从零开始顺利完成了ns-3的安装。本篇为ns-3安装过程记录贴或针对小白的零基础教程。 本篇内容所使用到的软件版本信息如下&#xff1a;VMware…

这5个代码技巧,让我的 Python 加速了很多倍

Python作为一种功能强大的编程语言&#xff0c;因其简单易学而受到很多初学者的青睐。它的应用领域又非常广泛&#xff1a;科学计算、游戏开发、爬虫、人工智能、自动化办公、Web应用开发等等。 而在数据科学领域中&#xff0c;Python 是使用最广泛的编程语言&#xff0c;并且…

【Flink】Flink时间语义详解

简介 在流处理中&#xff0c;时间是一个非常核心的概念&#xff0c;是整个系统的基石。我们经常会遇到这样的需求&#xff1a;给定一个时间窗口&#xff0c;比如一个小时&#xff0c;统计时间窗口内的数据指标。那如何界定哪些数据将进入这个窗口呢&#xff1f;在窗口的定义之…

【C语言】程序环境和预处理|预处理详解|定义宏(下)

主页&#xff1a;114514的代码大冒 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 2.5带副作用的宏参数 2.6宏和函数的对比 3#undef ​编辑 4 命令行定义…

直播 | StarRocks 实战系列第二期--导入优化&问题排查

2023 年开春&#xff0c; StarRocks 社区重磅推出入门级实战系列直播&#xff0c;手把手带你从 Zero to Hero 成为一个 “StarRocks Pro”&#xff01;通过实际操作和应用场景的结合&#xff0c;我们将帮你系统性地学习 StarRocks 这个当今最热门的开源 OLAP 数据库。本次&…

WebSocket+xterm+springboot+vue 实现 xshell 操作linux终端功能

效果图 1.工具介绍与安装 1.1 xterm.js xterm 是一个使用 TypeScript 编写的前端终端组件&#xff0c;可以直接在浏览器中实现一个命令行终端应用。Xterm.js 适用于大多数终端应用程序&#xff0c;如 bash&#xff0c;vim 和 tmux&#xff0c;这包括对基于curses的应用程序和…

反击爬虫,前端工程师的脑洞可以有多大?

1. 前言对于一张网页&#xff0c;我们往往希望它是结构良好&#xff0c;内容清晰的&#xff0c;这样搜索引擎才能准确地认知它。而反过来&#xff0c;又有一些情景&#xff0c;我们不希望内容能被轻易获取&#xff0c;比方说电商网站的交易额&#xff0c;教育网站的题目等。因为…

港科夜闻|广州市市长郭永航先生与香港科大校董会廖长城先生一行举行座谈交流...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、广州市市长郭永航先生与香港科大校董会廖长城先生一行举行座谈交流。2月9日上午&#xff0c;双方就推进香港科技大学(广州)建设发展进行深入交流&#xff0c;并一致表示&#xff0c;将全力推动落实《南沙方案》中“打造高等…

【基础篇】一文掌握css的盒子模型(margin、padding)

1、CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容。盒模型允许我们在其它元素和周围元素边框之间的空间放置元素…

文献的阅读的习惯与方法

文献阅读是每个研究人员都要做的事情&#xff0c;然而虽然每个人都在阅读&#xff0c;但是每个人的阅读效率不一样&#xff0c;总结有效的方式是非常重要的。本笔记将梳理我在阅读文献中的方法和所在其中的关注点。 阅读文献有两种目的&#xff0c;第一种目的是日常阅读和学习…

ThinkPHP5美食商城系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP5美食商城系统一 介绍 此美食商城系统基于ThinkPHP5框架开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。用户注册登录后可购买美食&#xff0c;个人中心&#xff0c;评论和反馈等&#xff…

一手教你如何搭建Hadoop基于Zookeeper的集群(5台主机)

文章目录一、设计集群图二、准备五台虚拟机2.1、下载安装文件2.2、创建虚拟机2.3、配置网络2.4、修改主机名称2.5、关闭防火墙2.6、同步时间2.7、设置/etc/hosts文件2.8、设置免密登录2.9、为后面可以主备替换安装psmisc三、安装JDK3.1、安装jdk3.2、测试jdk是否安装成功3.3、将…

Android笔记:动画

文章目录1.View Animation&#xff08;视图动画&#xff09;1.1 Tween Animation&#xff08;补间动画&#xff09;Animation 继承属性透明度alpha缩放scale移动translate旋转rotateset标签Animation父类共有函数1.2Frame Animation &#xff08;逐帧动画&#xff09;2.Propert…