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

《数字图像处理-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 pltif __name__ == '__main__':# 生成灰度图像hImg, wImg = 512, 512img = 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.0noiseGause = 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=175plt.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.hqwc.cn/news/298315.html

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

相关文章

hash长度扩展攻击

作为一个信息安全的人,打各个学校的CTF比赛是比较重要的! 最近一个朋友发了道题目过来,发现有道题目比较有意思,这里跟大家分享下 这串代码的大致意思是: 这段代码首先引入了一个名为"flag.php"的文件&am…

AI 论文精读,中文视频讲解:剖析人工智能本质 | 开源日报 No.120

mli/paper-reading Stars: 21.8k License: Apache-2.0 深度学习论文精读是一个深度学习相关论文列表,包括计算机视觉、生成模型、自然语言处理等多个领域。 该项目的核心优势和特点包括: 提供了大量关于深度学习各领域热门文章内容对不同年份发表的有较…

遍历二叉树的Morris序

参考书:《程序员代码面试指南》 这种方法的好处在于,它做到了时间复杂度为O(n),额外空间复杂度为O(1)(只申请几个变量就可以完成整个二叉树的遍历)。 Morris遍历时cur访问节点的顺序就是morris序,可以在M…

61.SVN版本控制系统

SVN(Subversion)是一种集中式版本控制系统,它有一个中央仓库用于存储代码库的完整历史记录。相对于分布式版本控制系统(例如 Git),SVN 不支持本地仓库。 一、SVN 安装。 (1)在windo…

Dijkstra(迪杰斯特拉)算法总结

知识概览 Dijkstra算法适用于解决所有边权都是正数的最短路问题。Dijkstra算法分为朴素的Dijkstra算法和堆优化版的Dijkstra算法。朴素的Dijkstra算法时间复杂度为,适用于稠密图。堆优化版的Dijkstra算法时间复杂度为,适用于稀疏图。稠密图的边数m和是一…

swing快速入门(二十七)

注释很详细,直接上代码 上一篇 新增内容 1.为按钮指定图标 2. 列表框的并列 3.菜单项绑定快捷键 4.控件悬浮提示信息 5.菜单项设置小图标 6.五种布局风格右键选择切换 package swing21_30;import javax.swing.*; import java.awt.*; import java.awt.event.…

mysql原理--基于成本的优化

1.什么是成本 我们之前老说 MySQL 执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者说代价最低的那种方案去真正的执行查询。不过我们之前对 成本 的描述是非常模糊的,其实在 MySQL 中一条查询语句的执行成本是由下边这两个方面组…

Android 13 - Media框架(26)- OMXNodeInstance(三)

上一节我们了解了OMXNodeInstance中的端口定义,这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的,以及如何关联起来的。(我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创…

状态管理概述

ArkTS UI的状态管理到这里就叙述完了,现在做一个概述,也可以认为是一个总结。 在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回…

【LeetCode:1954. 收集足够苹果的最小花园周长 | 等差数列 + 公式推导】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

20231224解决outcommit_id.xml1 parser error Document is empty的问题

20231224解决outcommit_id.xml1 parser error Document is empty的问题 2023/12/24 18:13 在开发RK3399的Android10的时候,出现:rootrootrootroot-X99-Turbo:~/3TB/Rockchip_Android10.0_SDK_Release$ make installclean PLATFORM_VERSION_CODENAMEREL…

17个常用经典数据可视化图表与冷门图表

数据可视化是创建信息图形表示的过程。随着可视化技术的飞速发展,可以利用强大的可视化工具选择合适的数据可视化图表来展示数据。以下专业人士都应该知道的一些最重要的数据可视化图表。 常见数据可视化图表 饼图 饼图是最常见和最基本的数据可视化图表之一。饼图…