OpenCV-Python学习(10)—— OpenCV 图像二值化处理(cv.threshold)

article/2025/11/6 7:32:23

1. 学习目标

  1. 理解图像的分类,不同类型的图像的区别;
  2. 对图像进行二值化处理,对【 cv.threshold 】函数的理解。

2. 图像分类

2.1 不同类型图像说明

按照颜色对图像进行分类,可以分为二值图像、灰度图像和彩色图像。

  1. 二值图像:只有黑色和白色两种颜色的图像。 每个像素点可以用 0/1 表示,0 表示黑色,1 表示白色。
  2. 灰度图像:只有灰度的图像。 每个像素点用 8bit 数字 [0,255] 表示灰度,如:0 表示纯黑,255 表示纯白。
  3. 彩色图像:彩色图像通常 采用红色(R)、绿色(G)和蓝色(B)三个色彩通道的组合表示。

2.2 彩色图像

import cv2 as cvimg = cv.imread('./images/messi5.jpg')
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

2.3 灰度图像

  1. 方法一:读取图像时,使用灰度模式读取;
import cv2 as cvimg = cv.imread('./images/messi5.jpg',0)
cv.imshow('image_gray', img)
cv.waitKey(0)
cv.destroyAllWindows()
  1. 方法二:使用 cv.cvtColor 颜色空间转换;
import cv2 as cvimg = cv.imread('./images/messi5.jpg')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('image_gray', img_gray)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

3. 图像二值化处理

3.1 函数调用

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

3.2 参数说明

参数说明
src表示变换操作的输入图像,nparray 二维数组, 必须是单通道灰度图像!
thresh表示阈值,取值范围 0~255。
maxval表示填充色,取值范围 0~255,一般取 255。
type表示变换类型。
dst表示返回阈值变换的输出图像。

3.3 type 值说明

说明
cv.THRESH_BINARY表示大于阈值时置 255,否则置 0。
cv.THRESH_BINARY_INV表示大于阈值时置 0,否则置 255。
cv.THRESH_TRUNC表示大于阈值时置为阈值 thresh,否则不变(保持原色)。
cv.THRESH_TOZERO表示大于阈值时不变(保持原色),否则置 0。
cv.THRESH_TOZERO_INV表示大于阈值时置 0,否则不变(保持原色)。
cv.THRESH_OTSU表示使用 OTSU 算法选择阈值。

3.4 二值图像

3.4.1 PNG 透明背景转二值图像

由于透明位置都是0,所以阀值设置为10就能很完美的转换二值图像!

import cv2 as cvimg = cv.imread('./images/opencv-logo-white.png')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('image_gray', img_gray)
ret, mask = cv.threshold(img_gray, 10, 255, cv.THRESH_BINARY)
cv.imshow('image_mask', mask)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

3.4.2 JPG 复杂背景转二值图像

由于背景颜色比较复杂,所以阀值需要不断的调试,测试25时,返回的二值图像最佳,没有噪点!

import cv2 as cvimg = cv.imread('./images/butterfly.jpg')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('image_gray', img_gray)
ret, mask = cv.threshold(img_gray, 25, 255, cv.THRESH_BINARY_INV)
cv.imshow('image_mask', mask)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

4. 注意

  1. 函数 cv.threshold 进行 固定阈值 的二值化处理;函数 cv.adaptiveThreshold自适应阈值 的二值化处理函数,可以通过比较像素点与周围像素点的关系动态调整阈值。
  2. 确切地说,只有 type 为 cv.THRESH_BINARY 或 cv.THRESH_BINARY_INV 时输出为二值图像,其它变换类型时进行阈值处理但并不是二值处理。

5. 总结

  1. 函数 cv.threshold 只有 type 为 cv.THRESH_BINARY 或 cv.THRESH_BINARY_INV 时输出为二值图像,其它变换类型时进行阈值处理但并不是二值处理。
  2. 函数 cv.threshold 是进行 固定阈值 的二值化处理。

http://chatgpt.dhexx.cn/article/krP2rIC7.shtml

相关文章

python 图像二值化处理

python 图像二值化处理 import os from PIL import Image import shutilfile_path ./5-crack919/mask/ save_path ./5-crack919/mask01/ if not os.path.exists(save_path):os.makedirs(save_path) ###二值化 for filename in os.listdir(file_path):print(filename)img …

图像处理之二值化图像

图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。将所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0&#xff0…

二值化之阈值处理

写于开头的废话:哒哒哒.......这应该是马蹄的声音!我在告诉你,我又来了!不得不说的还是自己的悲伤,经营了那么久的CSDN居然说关就给我关了,过去的还是没法过去,我始终不能从失去的痛苦之中走出来…

图像处理之二值化

图像处理之二值化 二值化方式 二值化算法 二值化方式 二值化方式分为五种: THRESH_BINARY:将大于某一个阈值的变成最大值,其他为0 THRESH_BINARY_INV:和THRESH_BINARY恰好相反 THRESH_TRUNC: trunc就是截断的意思&…

二值化方法

一、全局阈值法 1.固定阈值方法 该方法是对于输入图像中的所有像素点统一使用同一个固定阈值。其基本思想如下: 其中,T为全局阈值。 缺点:很难为不同的输入图像确定最佳阈值。 2.Otsu算法 Otsu算法又称最大类间方差法 先明确两个概念: (1)均值 (2)方差 图像的阈…

图像处理一之-摄像头二值化处理-(什么是二值化)

图像二值化 binary image 什么是二值化: 二值化是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值(阈值)的像素灰度设为灰度极大值(255),把小于这个值的像素灰度设为灰度极小值(0)&#…

C#多线程详解(一) Thread.Join()的详解

什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。 而一个进程又是由多个线程所组成的。 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的专有寄存器…

1.java的协程_虚拟线程

盼过了春天盼秋天,从2017年到今天五年了,终于盼到loom转正了,当看到jdk19预览api的时候心情那个激动。。。期待已久的协程终于来临,再也不羡慕别人家的go孩子,咱终于可以理直气壮的说一句:咱也有&#xff0…

Kotlin协程到底是怎么切换线程的?你是否知晓?

好文推荐: 作者:RicardoMJiang 前言 之前对协程做了一个简单的介绍,回答了协程到底是什么的问题,感兴趣的同学可以了解下:【带着问题学】协程到底是什么? 通过上文,我们了解了以下内容 1.kotlin协程本质上对线程池的…

进程和线程、协程的区别

一、进程 进程是程序一次动态执行的过程,是程序运行的基本单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、页表、文件句柄等)比较…

进程、线程与协程的比较

进程、线程和协程是三个在多任务处理中常听到的概念,三者各有区别又相互联系。 一、并行和并发 在介绍进程、线程和协程这三个概念之前,有两个操作系统中的相关概念需要简单解释一下:并行和并发。 并行:指多个任务同时执行。 并…

进程、线程、协程

进程、线程、协程 一、概念与区分 1、进程 进程是程序一次动态执行的过程,是程序运行的基本单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、…

终于明白:有了线程,为什么还要有协程?

并发的发展历史 其实,在早期计算机并没有包含操作系统,这个时候,这个计算机只跑一个程序,这个程序独享计算机的所有资源,这个时候不存在什么并发问题,但是对计算机的资源来说,确实是一种浪费。…

Java中的多线程(线程间通信)

/学习笔记/ 线程间通信: 多个线程在处理同一资源,但是任务却不同。 先看一个例子,采用两个线程执行进行输入和输出任务: //资源class Resource{String name;String sex;}//输入class Input implements Runnable{Resource r ;// …

协程和线程的区别、协程原理与优缺点分析、在Java中使用协程

文章目录 什么是协程协程的优点与缺点协程实现原理.协程与线程在不同编程语言的实现在Java中使用协程Kilim介绍Kilim整合Java,使用举例 小总结 什么是协程 相对于协程,你可能对进程和线程更为熟悉。进程一般代表一个应用服务,在一个应用服务中可以创建多…

进程、线程和协程之间的区别和联系

文章目录 一、进程二、线程三、进程和线程的区别与联系四、一个形象的例子解释进程和线程的区别五、进程/线程之间的亲缘性六、协程 一、进程 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个…

简单了解线程和协程(C#)

1.为什么需要线程和协程: (1)使程序中的任务可以并发执行,让程序同时处理多个任务,提高程序的运行效率和响应速度 (2)线程和协程可以共享同一个进程的资源,避免多个进程之间的资源浪…

线程与协程

线程与协程 概念进程【进程间通信(IPC)】 线程协程 区别场景计算密集型IO密集型两种操作如何优化哪些语言对多协程的支持 概念 进程 二进制可执行文件在计算机内存里的一个运行实例。比如.exe文件是个类,进程就是new出来的那个实例&#xf…

总结:协程与线程

一、介绍 本文主要梳理下进程,线程,协程的概念、区别以及使用场景的选择。 二、进程 我们知道,一切的软件都是跑在操作系统上,真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完…

Java线程协程

目录 线程的实现(OS&&JVM) 1.内核线程实现 2.用户线程实现 3.混合实现 4.Java线程的实现 ——如何实现不受Java虚拟机规范的约束 Java线程调度——系统自动完成(可能被干预) Java线程状态转换 内核线程的局限 协…