图像处理之二值化图像

article/2025/11/6 8:41:06

图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。将所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。下面详细介绍图像二值化过程。

阈值设定分为:
    1.全局性质的阈值(又分为简单阈值和自适应阈值)
    2.局部性质的阈值(Otsu's二值化)
首先,用设置阈值的图像都必须是灰度图像。其次,在设置简单阈值和Otsu's二值化时,使用cv2.threshold()函数。而在设置自适应阈值时,使用cv2.adaptiveThreshold()函数。

cv2.threshold()函数,它有四个输入,第一个是原图像(必须为灰度图),第二个是阈值,第三个是高于(低于)阈值赋予的新的像素,第四个是选择性参数:
  cv2.THRESH_BINARY(黑白二值)
  cv2.THRESH_BINARY_INV(黑白二值反转)
  cv2.THRESH_TRUNC (得到的图像为多像素值)
  cv2.THRESH_TOZERO(黑灰二值)
  cv2.THRESH_TOZERO_INV(黑灰二值反转)
  该函数有两个返回值,第一个ret值(得到的阈值值),第二个th值就是阈值化后的图像。

cv2.adaptiveThreshold() 函数,它有六个参数:
第一个原始图像
第二个像素值上限
第三个自适应方法Adaptive Method:
 cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
 cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权重为一个高斯窗口
第四个值的赋值方法:只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
第五个Block size:规定领域大小(一个正方形的领域)
第六个常数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值,就是求得领域内均值或者加权值)

Otsu's二值化:
   这是一个更加适合于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用。那么经过Otsu’s得到的那个阈值就是函数cv2.threshold的第一个参数了。因为Otsu’s方法会产生一个阈值,那么函数cv2.threshold的的第二个参数(设置阈值)就是0了,并且在cv2.threshold的方法参数中还得加上语句cv2.THRESH_OTSU。

# 下面就是对以上三种设置阈值方式的一个例子
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("DLS.jpg", 0)
img = cv2.medianBlur(img, 5)
ret1, th1 = cv2.threshold(img, 127, 225, cv2.THRESH_BINARY)
ret2, th_1 = cv2.threshold(img, 0, 225, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print ret2
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
titles = ["Original Image", "Global Thresholding(v = 127)", "Adaptive Mean Thresholding", "Adaptive Gaussian Thresholding", "Otsu Thresholding", "Histogram"]
images = [img, th1, th2, th3, th_1, ret2]
for i in xrange(6):plt.subplot(3,2,i+1)if i < 5:plt.imshow(images[i], "gray")plt.xticks([]), plt.yticks([])if i == 5:plt.hist(img.ravel(), 256)plt.title(titles[i])plt.savefig("Threshold_image")


从上图可以清楚的看出使用Otsu‘s是最好的区别了前景和背景,但是,这也不是绝对,个人觉得算法没有好坏,只有合适不合适还有参数设置是否最佳。针对不同的图像,可能得到的效果不一致。
















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

相关文章

二值化之阈值处理

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

图像处理之二值化

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

二值化方法

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

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

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

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

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

1.java的协程_虚拟线程

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

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

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

进程和线程、协程的区别

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

进程、线程与协程的比较

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

进程、线程、协程

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

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

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

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

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

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

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

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

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

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

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

线程与协程

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

总结:协程与线程

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

Java线程协程

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

CDH6.3.2安装文档

正式安装之前&#xff0c;先说明一下CDH是基于Apache Hadoop及相关项目的发行版。CDH通过WEB界面管理&#xff0c;并提供了hadoop的两个核心功能&#xff1a;可扩展存储和分布式计算&#xff0c;以及企业级的重要功能。CDH是遵循Apache-licensed的开源软件&#xff0c;提供了基…

CDH数仓项目(一) —— CDH安装部署搭建详细流程

0 说明 本文以CDH搭建数据仓库&#xff0c;基于三台阿里云服务器从零开始搭建CDH集群&#xff0c;节点配置信息如下&#xff1a; 节点内存安装服务角色chen10216Gcloudera-scm-serverchen1038Gcloudera-scm-agentchen1048Gcloudera-scm-agent 上传需要用到的安装包&#xff…