opencv-python库 cv2图像二值化详解

文章目录

  • 图像二值化原理
  • cv2.threshold()
  • Qtsu二值化
  • cv2.adaptiveThreshold

图像二值化原理

图像二值化原理是通过设定一个阈值,将图像中的像素点的灰度值与阈值进行比较,大于阈值的像素点设置为白色,小于阈值的像素点设置为黑色
1。图像二值化是将彩色或灰度图像转换为只包含两种颜色(通常是黑色和白色)的二值图像的过程1。

图像二值化通常分为自适应二值化、定阈二值化、OTSU算法等。定阈二值化是用户把整幅图像上的每个像素点的灰度值设定为某一阈值,当灰度值大于该阈值时,其灰度值被视为"1",如果小于该阈值,其灰度值被视为"0",从而实现了图像二值化2。

cv2.threshold()

cv2.threshold 是 OpenCV(一个开源的计算机视觉库)中的一个函数,用于对图像进行阈值处理,也就是将图像转换为二值图像。这个函数特别适用于那些需要明确区分前景和背景的情况,例如,当你想要检测图像中的某个物体时。
函数原型

cv2.threshold(src, thresh, maxval, type[, dst])

参数说明

  • src:输入图像,通常是一个灰度图像。阈值处理通常在灰度图像上进行,因为灰度图像只有一个通道,处理起来比较简单。
  • thresh:阈值。这是一个用于分类像素值的参数。所有小于 thresh 的像素值都会被赋予一个新的值(通常是 0),而所有大于或等于 thresh 的像素值都会被赋予另一个值(通常是 maxval)。
  • maxval:当像素值超过阈值时,所赋予的值。在二值化的情况下,这通常是 255(白色)。
  • type:阈值类型,决定了如何处理像素值与阈值之间的关系。OpenCV 提供了多种阈值类型,如:
    • cv2.THRESH_BINARY:二值化阈值化。所有大于 thresh 的像素值设为 maxval,小于等于 thresh 的像素值设为 0。
    • cv2.THRESH_BINARY_INV:反二值化阈值化。所有大于 thresh 的像素值设为 0,小于等于 thresh 的像素值设为 maxval。
    • cv2.THRESH_TRUNC:截断阈值化。所有大于 thresh 的像素值设为 thresh,小于等于 thresh 的像素值不变。
    • cv2.THRESH_TOZERO:阈值化为 0。所有大于 thresh 的像素值不变,小于等于 thresh 的像素值设为 0。
    • cv2.THRESH_TOZERO_INV:反阈值化为 0。所有大于 thresh 的像素值设为 0,小于等于 thresh 的像素值不变。
  • dst:输出图像,是一个可选参数。如果提供了这个参数,函数会将结果存储在这个图像中,而不是创建一个新的图像。

使用示例

import cv2# 读取图像并转换为灰度图像
image = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)# 应用阈值处理
ret, thresholded_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 显示原始图像和阈值化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Thresholded Image', thresholded_image)# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们读取了一个图像,将其转换为灰度图像,然后应用了二值化阈值处理。ret 变量存储了使用的阈值,而 thresholded_image 是阈值处理后的图像。最后,我们显示了原始图像和阈值化后的图像。

Qtsu二值化

在OpenCV中,cv2.threshold 函数用于对图像进行阈值处理。当您使用 cv2.THRESH_BINARY 与 cv2.THRESH_OTSU 结合时(使用位运算符 | 来组合它们),这意味着您想使用大津算法(Otsu’s method)来自动计算一个最优阈值,并将图像二值化。
使用 | 符号来组合 cv2.THRESH_BINARY 和 cv2.THRESH_OTSU 意味着您希望同时应用这两种操作:二值化图像并使用Otsu’s 方法计算阈值。

下面是一个Python代码示例,展示了如何使用 cv2.threshold 函数和Otsu’s 方法:

import cv2# 读取图像并转换为灰度图像
gray_img = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)# 使用Otsu's 方法计算阈值并进行二值化
ret, thresh_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)# ret变量现在包含由Otsu's 方法计算出的最优阈值
# thresh_img是应用了这个阈值后的二值化图像# 显示原始图像和二值化后的图像
cv2.imshow('Original Image', gray_img)
cv2.imshow('Thresholded Image', thresh_img)# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,ret 变量将包含由Otsu’s 方法计算出的最优阈值,而 thresh_img 是应用了这个阈值后的二值化图像。这种方法在处理光照不均或具有不同对比度的图像时特别有用,因为它可以自动适应图像内容来确定最佳阈值。

cv2.adaptiveThreshold

cv2.adaptiveThreshold 是 OpenCV 中的一个图像处理函数,用于对灰度图像进行自适应阈值处理。与全局阈值处理不同,自适应阈值处理根据图像的局部区域来确定阈值,因此可以有效地处理光照不均匀的图像1。

以下是 cv2.adaptiveThreshold 的详细用法和参数说明:
函数原型

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

参数说明

  • src:输入图像,应为灰度图像。
  • maxValue:当像素值超过(或小于,取决于阈值类型)计算出的阈值时,所赋予的值。通常设置为 255,表示白色。
  • adaptiveMethod:自适应方法,决定如何计算阈值。常用的有 cv2.ADAPTIVE_THRESH_MEAN_C(邻域内像素的平均值)和 cv2.ADAPTIVE_THRESH_GAUSSIAN_C(邻域内像素的高斯加权和)。
  • thresholdType:阈值类型,决定如何应用阈值。常用的有 cv2.THRESH_BINARY(二值化)和 cv2.THRESH_BINARY_INV(反二值化)。
  • blockSize:计算阈值时要考虑的邻域大小(像素数量)。这个值必须是奇数。
  • C:从计算出的阈值中减去的常数。

使用示例

import cv2# 读取图像并转换为灰度图像
gray_img = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)# 使用自适应阈值处理
thresh_img = cv2.adaptiveThreshold(gray_img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)# 显示原始图像和处理后的图像
cv2.imshow('Original Image', gray_img)
cv2.imshow('Adaptive Threshold Image', thresh_img)# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,blockSize 设置为 11(一个奇数),C 设置为 2。你可以根据图像的特点调整这些参数以获得最佳效果。

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

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

相关文章

JavaScript中堆栈内存管理机制及其在深拷贝与浅拷贝场景中的应用与解析

一.堆栈的定义 1.栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。 结论:后进先出(Last In First Out),简称为LIFO线性表。 栈的应用有:数制转换,语法词法分析&…

【云原生篇】K8S之Job 和 CronJob

在 Kubernetes (K8s) 中,Job 和 CronJob 是两种管理批处理任务的资源对象,它们用于控制短暂的一次性任务(Job)或定时执行的周期性任务(CronJob)。 Job 概念 Job 负责运行一个或多个 Pod,并确…

刷题之Leetcode704题(超级详细)

704. 二分查找 力扣题目链接(opens new window)https://leetcode.cn/problems/binary-search/ 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标&am…

RecyclerView滑动到item顶部或底部

最近在开发的时候,遇到了需要通过代码使得RecyclerView能够滑到指定item顶部位置的需求,在查看源码之后,发现RecyclerView已经提供了实现滑动到指定位置的方法,下面是可实现方法: //平滑滚动 recyclerView.smoothScrollToPosition(position)…

【Flink实战系列】Flink 双流 Join 出现数据倾斜如何解决?

【Flink实战系列】Flink 双流 Join 出现数据倾斜如何解决? 在 Flink 里面常见的数据倾斜有两种 计算场景Join 场景第一种计算场景,比如我们常说的 WordCount 计算,这种问题可以参考这篇文章,Flink发生数据倾斜怎么优化任务?(两段聚合的方式) 第二种 Join 场景,是我们今…

手写SpringBoot(五)之整合AOP

系列文章目录 手写SpringBoot(一)之简易版SpringBoot 手写SpringBoot(二)之动态切换Servlet容器 手写SpringBoot(三)之自动配置 手写SpringBoot(四)之bean动态加载 手写SpringBoot&…

聚合DNS管理系统v1.0全新发布 域名解析管理系统

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&…

【Django开发】0到1美多商城项目md教程第5篇:短信验证码,1. 避免频繁发送短信验证码逻辑分析【附代码文档】

美多商城完整教程(附代码资料)主要内容讲述:欢迎来到美多商城!,项目准备。展示用户注册页面,创建用户模块子应用。用户注册业务实现,用户注册前端逻辑。图形验证码,图形验证码接口设…

似包非包 + 卡特兰数

1、似包非包---组合总和Ⅳ 背包:解决的是“有限制条件下”的“组合”问题 不能解决排列问题 377. 组合总和 Ⅳ - 力扣(LeetCode) class Solution {//注意示例一:(1,1,2)和(1,2,1)和(2,1,1)是不同组合,这是排列组合中的排列,不是组合!!!//背包问题://解决的是“有限…

python学习23:python中的列表(list)中的常用方法

列表(list)中的常用方法 1.列表中常用的方法主要有如下的方法: 2.代码演示主要常用的方法 查找某元素在列表内的下标索引:list.index(元素) start_list [coco, xuanxuan, taotao] # 1.1 查找某元素在列表内的下标索引 index start_list…

【力扣】485.最大连续 1 的个数

485. 最大连续 1 的个数 题目描述 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是…

元素定位---自动化测试

元素定位 1. 根据id属性进行定位(唯一的id) 2. name属性进行定位 3. tag name (标签名)定位和class name(标签中的class属性)定位 (1)使用class name 定位搜狗搜索框 (2&…

MySQL-单行函数:数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、MySQL信息函数、其他函数、单行函数练习

1.数值函数 1.1 基本的操作 SELECT ABS(-123),ABS(32),SIGN(-23),SIGN(43),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32), FLOOR(-43.23),MOD(12,5),12 MOD 5,12 % 5 FROM DUAL;1.2 取随机数 SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1) FROM DUAL;1.3 四…

00150 第一节 货币的起源与货币形式的演变 练习题

目录 一、单选题 二、多选题 三、名词解释题 四、简答题 一、单选题

Eclipse EMF教程(下)

Eclipse EMF教程(下) 翻译自:https://eclipsesource.com/blogs/tutorials/emf-tutorial/ 在接下来的部分中,我们将探索我们生成的代码的EMF API。 EMF API 在教程的这一部分,我们将探索EMF的API,包括生成…

C语言基础语法-教案16(从小白到劝退之结构体初阶)

最近给大家争取到一个 深夜福利 保证你在深夜手机刷到 嘎嘎香~ 那就是 大流量卡 缺点:月租太便宜 185GB~ 100分钟通话时长~ 长期套餐~ 畅想自由的气息 流量自由的同时还拥有超长通话,而且免费领取。 名额有限,咱们废话不多说直接上…

JS详解-手写Promise!!!

前言: 针对js的深入理解,作者学习并撰写以下文章,由于理解认知有限难免存在偏差,请大家指正!所有定义来自mdn。 Promise介绍: 对象表示异步操作最终的完成(或失败)以及其结果值. 描…

代码随想录训练营第三十五期|第2天|数组part02|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int[] sortedSquares(int[] nums) {int[] res new int[nums.length];int idx nums.length - 1;int left 0;int right nums.length - 1;while (left < right) {if (nums[left] * nu…

为什么JOS操作系统是用C语言实现的,why not高级编程语言?

C的优点 C提供了大量的控制能力&#xff0c;C可以完全控制内存分配与释放。C几乎没有隐藏的代码&#xff0c;几乎可以在阅读C代码的时候想象到对应的RISC-V机器指令是什么。通过C可以直接访问内存&#xff0c;可以读写PTE的bit位或者设备寄存器。使用C会有极少的依赖&#xff…

7天八股速记之Java 后端——Day 1

接口和抽象类的区别 接口抽象类方法抽象方法既可以有抽象方法&#xff0c;也可以有普通方法关键字修饰interfaceabstract定义常量变量只能定义静态常量成员变量子类方法所有方法必须实现实现所有的抽象方法子类继承多继承单继承构造方法不能有构造方法可以有构造方法接口实现只…