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

news2024/10/3 0:28:06

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/347818.html

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

相关文章

回收站清空了还能找回来吗?回收站恢复的4个方法(最全)

回收站作为一个数据回收的地方,可以保存已删除的文件很久,直到用户手动永久删除这些数据,这为用户避免了许多数据丢失的问题。但是回收站数据过多,难免会影响电脑的运行速度。为此,我们都会定期进行清理。 清理过程中…

LeetCode 92. 反转链表 II

原题链接 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给你单链表的头指针 headheadhead 和两个整数 leftleftleft 和 rightrightright &#xff0c;其中 left<rightleft < rightleft<right 。请你反转从位置 leftleftleft 到位置 rightrightrig…

Scala 入门(第一章Scala 环境搭建、插件的安装)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 第 1 章 Scala 入门1.1 概述1.1.1 为什么学习 Scala1.1.2 Scala 发展历史1.1.3 Scala 和 Java 关系1.1.4 Scala 语言特点1.2 Scala 环境搭建1.3 Scala 插件安装1.4 HelloWorl…

Web 容器、HTTP 服务器 、Servlet 容器区别与联系

首先浏览器发起 HTTP 请求&#xff0c;像早期的时候只会请求一些静态资源&#xff0c;这时候需要一个服务器来处理 HTTP 请求&#xff0c;并且将相应的静态资源返回。 这个服务器叫 HTTP 服务器。 简单点说就是解析请求&#xff0c;然后得知需要服务器上面哪个文件夹下哪个名字…

三【mybatis的批量删除】

目录一 .批量删除的流程1.1 快速创建实体类1.1.1 创建完毕后 除了属性 其他内容进行删除1.2 创建mapper接口的抽象方法1.3 编写sql语句1.4 测试类Arrays.asList(删除对应的 id 值)运行结果✅作者简介&#xff1a;Java-小白后端开发者 &#x1f96d;公认外号&#xff1a;球场上的…

C语言指针剖析(初阶) 最详细!

什么是指针&#xff1f;指针和指针类型野指针指针运算指针和数组二级指针指针数组什么是指针&#xff1f;指针是内存中一个最小单元的编号&#xff0c;也就是地址。1.把内存划分为一个个的内存单元&#xff0c;一个内存单元的大小是一个字节。2.每个字节都给定唯一的编号&#…

GEE学习笔记九十一:栅格影像叠置分析

最近发现好多人都在问一个问题&#xff0c;两张影像如何取其相交区域&#xff1f;其实这个问题简单来讲就是多张栅格影像进行叠加分析。在GEE中栅格影像不像矢量数据那样有直接的函数来做数据分析&#xff0c;需要我们自己手动写一些代码来实现这些操作。要实现这个功能有很多方…

微信怎么开小店?【企业商家微信开店】

企业商家入局微信做营销已经是经营规划中必须做的一件事了&#xff0c;对于企业商家来说&#xff0c;最简单直接的方式就是开一个微信小店&#xff0c;然后通过自己宣传推广来在微信小店中成商品。那么企业商家在微信怎么开小店呢&#xff1f;下面内容分享给想在微信开店的企业…

滑块连杆模型仿真(含三菱ST+博途SCL计算源代码)

由滑块位置逆计算曲柄角度,请参看下面的文章链接,这篇博客主要计算由曲柄转动角度计算滑块位置。 https://blog.csdn.net/m0_46143730/article/details/128943228https://blog.csdn.net/m0_46143730/article/details/128943228简单的看下连杆滑块模型 模型的数学推导过程,大…

跨境电商新形式下,如何选择市场?

2022年&#xff0c;全球经济已经有增长乏力、通胀高起的趋势&#xff0c;美国等国家的通货膨胀情况令人担忧&#xff0c;不少行业面临更为复杂的外部环境以及严峻的市场挑战。不过&#xff0c;跨境电商行业依旧保持着较高的增长速度&#xff0c;越来越多有远见的卖家将电商事业…

C++之RALL机制

RALL是Resource acquisition is initialization的缩写&#xff0c;意思是“资源获取即初始化”&#xff0c;其核心思想是利用C对象生命周期的概念来控制程序的资源。它的技术原理很简单&#xff0c;如果希望对某个重要资源进行跟踪&#xff0c;那么创建一个对象&#xff0c;并将…

C语言之结构体内存的计算

结构体的内存 一.提出疑问 结构体占用的是一片连续的内存空间&#xff0c;大小是由成员变量的类型决定的。但并不是计算所有成员变量的类型大小之和那么简单。 先举一个实例&#xff1a; struct student {int age; //4个字节int telephone; //4个字节 }; int main() {struc…

如何用P6软件编制项目进度计划(下)

卷首语 根据项目合同包含的工作范围进行工作分解&#xff08;WBS&#xff09;&#xff0c;按照业主的要求及项目管理的需要&#xff0c;考虑不同阶段和层次&#xff0c;适时编制出项目管理所要求的的各级进度计划。 4搜集项目计划与进度控制相关信息 搜集与项目计划编制与进…

IP地址在金融行业有哪些应用?

中国加入WTO以来经济得到迅速发展&#xff0c;金融行业随着经济发展体系越来越完善。随着西方金融公司和理念的加入中国金融行业开始多样化发展。金融行业在快速发展的同时也引发了许多弊端。如何维护挖掘客户更大需求&#xff1f;如何获取更多优质客户&#xff1f;如何提升网络…

使用netty+springboot打造的tcp长连接通讯方案

文章目录项目背景正文一、项目架构二、项目模块三、业务流程四、代码详解1.消息队列2.执行类3.客户端五、测试六、源码后记项目背景 最近公司某物联网项目需要使用socket长连接进行消息通讯&#xff0c;捣鼓了一版代码上线&#xff0c;结果BUG不断&#xff0c;本猿寝食难安&am…

大公司如何用A/B测试解决增长问题?

摘要&#xff1a;上线六年&#xff0c;字节跳动的短视频产品——抖音已成为许多人记录美好生活的平台。除了抖音&#xff0c;字节跳动旗下还同时运营着数十款产品&#xff0c;从资讯、游戏&#xff0c;到房产、教育等横跨多个领域。在产品迭代速度和创新能力的快速发展下&#…

AcWing语法基础课笔记 第三章 C++中的循环结构

第三章 C中的循环结构 学习编程语言语法是次要的&#xff0c;思维是主要的。如何把头脑中的想法变成简洁的代码&#xff0c;至关重要。 ——闫学灿 学习循环语句只需要抓住一点——代码执行顺序&#xff01; while循环 可以简单理解为循环版的if语句。If语句是判断一次&#xf…

MQ技术选型

RocketMQ部署架构图NameServer&#xff1a;主要是对元数据的管理&#xff0c;包括Topic和路由信息的管理&#xff0c;底层由netty实现&#xff0c;是一个提供路由管理、路由注册和发现的无状态节点&#xff0c;类似于ZooKeeperBroker&#xff1a;消息中转站&#xff0c;负责收发…

蓝桥杯模块学习17——AT24C02存储器(深夜学习——单片机)

一、硬件电路&#xff1a;1、引脚功能&#xff1a;&#xff08;1&#xff09;A0-A2&#xff1a;决定不同设备的地址码&#xff1a;&#xff08;2&#xff09;WP&#xff1a;写保护二、通讯方式&#xff08;IIC协议&#xff09;通讯方式与PCF8591相同&#xff0c;可参考以下文章…

【redis】redis缓存与数据库的一致性

【redis】redis缓存与数据库的一致性【1】四种同步策略【2】更新缓存还是删除缓存&#xff08;1&#xff09;更新缓存&#xff08;2&#xff09;删除缓存【3】先更新数据库还是先删除缓存&#xff08;1&#xff09;出现失败时候的情况1-先删除缓存&#xff0c;再更新数据库&…