《数字图像处理-OpenCV/Python》连载:图像的阈值处理

news2025/2/28 20:01:06

《数字图像处理-OpenCV/Python》连载:图像的阈值处理


本书京东 优惠购书链接 https://item.jd.com/14098452.html
本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第 9 章 图像的阈值处理


图像的阈值处理简单、直观,计算速度快,是很多图像处理算法的预处理过程。


本章内容概要

  • 学习图像的阈值处理方法,理解不同阈值对处理结果的影响。
  • 介绍利用图像局部特征的阈值处理方法,如自适应阈值处理和移动平均阈值处理。
  • 介绍HSV模型,学习基于HSV颜色范围的彩色图像阈值处理。

9.1 固定阈值处理

根据灰度值和灰度值的限制将图像划分为多个区域,或提取图像中的目标物体,是最基本的阈值处理方法。

当图像中的目标和背景的灰度分布较为明显时,可以对整个图像使用固定阈值进行全局阈值处理。如果图像的直方图存在明显边界,则很容易找到图像的分割阈值,但如果图像的直方图分界不明显,则很难找到合适的阈值,甚至可能无法找到固定阈值有效地分割图像。

当图像中存在噪声时,通常难以通过全局阈值将图像的边界完全分开。如果图像的边界是在局部对比下出现的,使用全局阈值的效果会很差。

OpenCV中的函数cv.threshold用于对图像进行阈值处理。

函数原型

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

参数说明

  • src:输入图像,是多维Numpy数组,允许为单通道图像或多通道图像。
  • dst:输出图像,与src的尺寸和通道数相同。
  • thresh:阈值,是浮点型数据,取值范围为0~255。
  • maxval:最大值,指饱和限值,用于部分变换类型,一般可取255。
  • type:阈值变换类型。
    • THRESH_BINARY:当大于阈值thresh时置为maxval,否则置为0。
    • THRESH_BINARY_INV:当大于阈值thresh时置为0,否则置为maxval。
    • THRESH_TRUNC:当大于阈值thresh时置为阈值thresh,否则保持不变。
    • THRESH_TOZERO:当大于阈值thresh时保持不变,否则置为0。
    • THRESH_TOZERO_INV:当大于阈值thresh时置为0,否则保持不变。
    • THRESH_OTSU:使用OTSU算法自动确定阈值,可以组合使用。
    • THRESH_TRIANGLE:使用Triangle算法自动确定阈值,可以组合使用。
  • retval:返回的阈值图像。

注意问题
(1)retval通常是二值化的阈值图像,但在某些类型(如TRUNC、TOZERO、TOZERO_INV)中返回的是阈值饱和图像。
(2)函数允许输入单通道或多通道图像,但是输入多通道图像时,要对各通道独立进行阈值处理。返回的阈值图像也是多通道图像,而不是黑白的二值图像,在使用时要特别谨慎。
(3)阈值变换类型为使用OTSU算法、Triangle算法时,只能处理8位单通道输入图像。
(4)阈值变换类型为使用OTSU算法、Triangle算法时,阈值thresh不起作用。


【例程0901】阈值处理之固定阈值法

本例程使用固定阈值法对灰度图像进行阈值处理。对于多峰灰度分布图像,阈值大小会严重影响阈值处理的结果。


# 【0901】阈值处理之固定阈值法
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    # 生成灰度图像
    hImg, wImg = 512, 512
    img = np.zeros((hImg, wImg), np.uint8)  # 创建黑色图像
    cv.rectangle(img, (60, 60), (450, 320), (127, 127, 127), -1)  # 矩形填充
    cv.circle(img, (256, 256), 120, (205, 205, 205), -1)  # 圆形填充
    # 添加高斯噪声
    mu, sigma = 0.0, 20.0
    noiseGause = np.random.normal(mu, sigma, img.shape)
    imgNoise = np.add(img, noiseGause)
    imgNoise = np.uint8(cv.normalize(imgNoise, None, 0, 255, cv.NORM_MINMAX))

    # 阈值处理
    _, imgBin1 = cv.threshold(imgNoise, 63, 255, cv.THRESH_BINARY)  # thresh=63
    _, imgBin2 = cv.threshold(imgNoise, 125, 255, cv.THRESH_BINARY)  # thresh=125
    _, imgBin3 = cv.threshold(imgNoise, 175, 255, cv.THRESH_BINARY)  # thresh=175

    plt.figure(figsize=(9, 6))
    plt.subplot(231), plt.axis('off'), plt.title("1. Original"), plt.imshow(img, 'gray')
    plt.subplot(232), plt.axis('off'), plt.title("2. Noisy image"), plt.imshow(imgNoise, 'gray')
    histCV = cv.calcHist([imgNoise], [0], None, [256], [0, 256])
    plt.subplot(233, yticks=[]), plt.title("3. Gray hist")
    plt.bar(range(256), histCV[:, 0]), plt.axis([0, 255, 0, np.max(histCV)])
    plt.subplot(234), plt.axis('off'), plt.title("4. threshold=63"), plt.imshow(imgBin1, 'gray')
    plt.subplot(235), plt.axis('off'), plt.title("5. threshold=125"), plt.imshow(imgBin2, 'gray')
    plt.subplot(236), plt.axis('off'), plt.title("6. threshold=175"), plt.imshow(imgBin3, 'gray')
    plt.tight_layout()
    plt.show()


程序说明:
(1) 运行结果,使用固定阈值法对图像进行阈值处理如图9-1所示。图9-1(1)所示为程序生成的测试图,图9-1(2)所示为在图9-1(1)上添加了高斯噪声,图9-1(3)所示为图9-1(2)的灰度直方图,具有3个显著的灰度峰值分布。
(2) 图9-1(4)~(6)所示为不同阈值对图9-1(2)进行阈值处理所得到的二值图像,结果是完全不同的。表明对于多峰灰度分布图像,阈值大小会严重影响阈值处理的结果。
(3) 图9-1(4)~(6)的分割结果中都带有大量噪点,表明噪点也会影响阈值处理的结果。

图9-1 使用固定阈值法对图像进行阈值处理在这里插入图片描述
**


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/135164986)
Copyright 2023 youcans, XUPT
Crated:2023-12-23

《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html

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

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

相关文章

ES-mapping

类似数据库中的表结构定义,主要作用如下 定义Index下的字段名( Field Name) 定义字段的类型,比如数值型、字符串型、布尔型等定义倒排索引相关的配置,比如是否索引、记录 position 等 index_options 用于控制倒排索记录的内容,有如…

【PWN学习】cannary绕过方式汇总

背景 利用cannary解题在现在的CTF比赛中似乎已经过时了,只是为了学习了解一下。 绕过的4种方式 目前我了解到的方式主要有以下4种 forksspstack_chk_failTLS canary attack fork 每次进程重启后的Canary是不同的,但是同一个进程中的Canary都是一样…

探秘JDK 10:崭新特性悉数解析

欢迎来到我的博客,代码的世界里,每一行都是一个故事 探秘JDK 10:崭新特性悉数解析 前言局部变量类型推断(var关键字)线程本地握手背景和用途:如何使用:优势: 改进的option集合工厂方法List.of() 方法&#…

化繁为简,Python快速入门,从基础到实践的学习。

文章目录 前言一、安装与运行命令行运行 python 文件 二、变量和简单数据类型2.1 变量命名规则2.2 字符串2.2.1 字符串的简单运算title()upper()、lower() 2.2.2 合并(拼接)字符串2.2.3 使用制表符或换行符来添加空白2.2.4 删除空白2.2.5 Python 2 中的 …

Arduino开发实例-APDS-9930环境光和趋近传感器驱动

APDS-9930环境光和趋近传感器驱动 文章目录 APDS-9930环境光和趋近传感器驱动1、APDS-9930介绍2、硬件准备及接线3、驱动实现1、APDS-9930介绍 APDS-9930模块由环境光、红外线和接近传感器组成。 检测距离可达 100 毫米。 APDS-9930 传感器测量环境光。 该传感器还可以在黑暗中…

trino-435版本windows下源码编译

一、源码下载地址 https://github.com/trinodb/trino/tags 二、编译环境及工具准备 1、maven &#xff08;1&#xff09;版本&#xff1a;3.6.3 &#xff08;2&#xff09;settings.xml配置 <?xml version"1.0" encoding"UTF-8"?> <settin…

融资项目——vue之事件监听

vue通过v-on进行事件监听&#xff0c;在标签中使用v-on:xxx&#xff08;事件名称&#xff09;进行监听&#xff0c;事件触发的相应方法定义在Vue对象中的methods中。如下图所示&#xff1a; 上述代码对按钮进行监听&#xff0c;点击按钮后就会触发solve函数。

2016年第五届数学建模国际赛小美赛C题对超级细菌的战争解题全过程文档及程序

2016年第五届数学建模国际赛小美赛 C题 对超级细菌的战争 原题再现&#xff1a; 最近有很多关于我们抗生素耐药性危机的讨论。进化出的能够抵抗抗生素的细菌每年杀死70万人&#xff0c;越来越强大的细菌正在世界各地传播。研究人员担心&#xff0c;我们将进入一个后抗生素时代…

分子动力学模拟

天玑算科研服务_模拟计算_超算租用_实验测试天玑算科研服务致力于营造良好科研生态环境&#xff0c;加速科研成果转换&#xff0c;500余位TOP高校博士计算工程师团队&#xff0c;涉及第一性原理、分子动力学模拟、有限元等领域&#xff0c;为电池、能源、化工、生物医药等领域提…

尚硅谷图解Java设计模式

尚硅谷图解Java设计模式 第 1 章 内容介绍和授课方式Java 设计模式内容介绍先看几个经典的面试题设计模式的重要性 课程亮点和授课方式 第 2 章 设计模式七大原则设计模式的目的设计模式七大原则单一职责原则基本介绍应用实例单一职责原则注意事项和细节 接口隔离原则(Interfac…

HarmonyOS构建第一个ArkTS应用(FA模型)

构建第一个ArkTS应用&#xff08;FA模型&#xff09; 创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&a…

18 Vue3中使用v-model绑定文本域

概述 使用v-model绑定文本域则属于不太常见的情况了&#xff0c;因为文本域一般会被富文本替代&#xff0c;而富文本的话一般又会引入一些第三方的富文本库&#xff0c;所以在真实的开发中&#xff0c;使用v-model绑定文本域的场景实际上并不多见。 这里&#xff0c;我们了解…

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

安全、效率、成本:混合云数据库管理的三重挑战!

随着业务需求的不断演变&#xff0c;数据在多云平台之间流动&#xff0c;给数据库管控带来了新的层次和复杂性。这给数据库管控带来了前所未有的挑战。企业可能面临着一系列问题&#xff0c;包括安全性挑战、管理复杂性、性能与效率问题、成本控制难题、缺乏统一的管理视图以及…

C++ 链表

目录 链表结构 一&#xff0c;单链表 1.实现基本的增删查改 2.对链表进行一些操作 &#xff08;1&#xff09;删除等于给定值的所有节点。 &#xff08;2&#xff09;翻转链表 &#xff08;3&#xff09; 返回中间节点的地址 &#xff08;4&#xff09;倒数第k个节点 &…

运维管理平台哪个好?如何挑选合适的运维管理平台?

运用运维管理平台来处理一些内部后勤事务或者对外的售后服务&#xff0c;是现在很多企业采用的管理方法&#xff0c;优势是成本较低&#xff0c;效率更高。那么&#xff0c;运维管理平台哪个比较好呢&#xff1f; 选择运维管理平台要先找准自己的需求&#xff0c;然后才能选出合…

Android JNI入门到基础

一、JNI项目创建 AS创建项目时选择NativeC 会创建一个基本的JNI项目 MainActivity中写java层的native方法 具体实现在cpp文件中 native-lib.cpp #include <jni.h> #include <string>extern "C" JNIEXPORT jstring JNICALL Java_com_cn_techvision_j…

增强客户获取能力:探索 B 端影片行销的影响

01 B端企业短视频营销的价值与难点 短视频营销在当今的市场中越来越受到重视。有数据显示&#xff0c;越来越多的市场人将尝试增加短视频营销的预算&#xff0c;并且在2023年&#xff0c;每5个市场人中就有1个人将尝试短视频营销。相较于内容深、信息量大的长视频&#xff0c;…

CRC循环冗余校验

CRC循环冗余检验&#xff1a; 一般会给定生成多项式&#xff0c;通过生成多项式确定P&#xff08;除数&#xff09;的值&#xff08;e.g. P ( X ) X 3 X 2 1 P(X)X^3X^21 P(X)X3X21表示除数 P 1101 P1101 P1101&#xff09; 带传送的数据记为M&#xff0c;M有k位。n位冗…

高级数据结构 <二叉搜索树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文二叉搜索树的概念二叉搜索树的基本功能实现二叉搜索树的基本框架插入节点删除节点查找函数中序遍历函数析构函数和销毁函数(后序遍历销毁)拷贝构造和赋值重载(前序遍历创建)其他函数…