skimage.filters.apply_hysteresis_threshold详解

本文内容均参考 s c i p y 1.9.1 scipy1.9.1 scipy1.9.1版本的源码,若有任何不当欢迎指出
我们截取官方注释如下:

def apply_hysteresis_threshold(image, low, high):
    """Apply hysteresis thresholding to ``image``.

    This algorithm finds regions where ``image`` is greater than ``high``
    OR ``image`` is greater than ``low`` *and* that region is connected to
    a region greater than ``high``.

    Parameters
    ----------
    image : array, shape (M,[ N, ..., P])
        Grayscale input image.
    low : float, or array of same shape as ``image``
        Lower threshold.
    high : float, or array of same shape as ``image``
        Higher threshold.

    Returns
    -------
    thresholded : array of bool, same shape as ``image``
        Array in which ``True`` indicates the locations where ``image``
        was above the hysteresis threshold.

    Examples
    --------
    >>> image = np.array([1, 2, 3, 2, 1, 2, 1, 3, 2])
    >>> apply_hysteresis_threshold(image, 1.5, 2.5).astype(int)
    array([0, 1, 1, 1, 0, 0, 0, 1, 1])

    References
    ----------
    .. [1] J. Canny. A computational approach to edge detection.
           IEEE Transactions on Pattern Analysis and Machine Intelligence.
           1986; vol. 8, pp.679-698.
           :DOI:`10.1109/TPAMI.1986.4767851`
    """

我一开始的时候只读到了这句话:

This algorithm finds regions where ``image`` is greater than ``high``
    OR ``image`` is greater than ``low`` *and* that region is connected to
    a region greater than ``high``.

我以为的是如果某一个区域的像素值如果在高低阈值之间,那么这个像素点就会被留下,但是不是这样的。这句话里面有一个重点地方为:

that region is connected to a region greater than ``high``.

这就表明了这个函数留下的有两种像素点:

  1. 超出最高阈值的
  2. 在低阈值与高阈值之间的像素点:如果这个点所在的low像素连通块(高低之间的)与高像素块有连接的话,那么这个像素块整体都会被保留

口说无凭,我们来看一下源码:

    low = np.clip(low, a_min=None, a_max=high)  # ensure low always below high
    mask_low = image > low
    mask_high = image > high
    # Connected components of mask_low
    labels_low, num_labels = ndi.label(mask_low)
    # Check which connected components contain pixels from mask_high
    sums = ndi.sum(mask_high, labels_low, np.arange(num_labels + 1))
    connected_to_high = sums > 0
    thresholded = connected_to_high[labels_low]
    return thresholded

这一段代码看似简单,但里面有很多函数必须要理解其含义才能明白这一整个代码。
在这里为了简单起见,我们把这个low和high都设置成常数。比如,low=20,high=50;

    mask_low = image > low
    mask_high = image > high

这两句是生成了一个mask_low和mask_high的bool矩阵,也就是True和False
接着往下看:

    labels_low, num_labels = ndi.label(mask_low)

这个函数是需要注意的。
在这里插入图片描述
这是官方文档中给出的示例,其实就是把每一个连通块进行标号,并且返回这个图里有几个连通块。
好,接下来来看这句话:

 sums = ndi.sum(mask_high, labels_low, np.arange(num_labels + 1))

小小的一句话却藏着很多机密,就是这一句话决定了我们前面说的那两种保留下来的像素点。
这个sum函数点进去之后是:

def sum(input, labels=None, index=None):
    """
    Calculate the sum of the values of the array.

    Notes
    -----
    This is an alias for `ndimage.sum_labels` kept for backwards compatibility
    reasons, for new code please prefer `sum_labels`.  See the `sum_labels`
    docstring for more details.

    """
    return sum_labels(input, labels, index)

这个sum_labels的官方文档是:
在这里插入图片描述
这里面的函数描述为:

Values of `input` inside the regions defined by `labels` are summed together.

这就意味着

 sums = ndi.sum(mask_high, labels_low, np.arange(num_labels + 1))

这句话的含义是统计Low(包含high)连通块上有多少个high,如果至少有一个,那么这个块将被保留。
至少我们得到的sums是全部连通块的high数量
应该形如
在这里插入图片描述
sums[i]表示第i个连通块的high数量。
接着往下看:

    connected_to_high = sums > 0

connected_to_high[i]就是表示第i个连通块是否与high相连,如果第i个连通块全是high的,那么一定保留,如果全是low,但是connected_to_high[i]>0,则保留,如果一半high一半low也保留,直接相连。
接下来的这一句话有点诡异,也为他是用矩阵做了索引。
但其实没啥,就是取得矩阵值做索引,然后把connected_to_high得值给放到相应位置上就可以了。

  thresholded = connected_to_high[labels_low]

label_low是连通块号,形状是图片形状。connected_to_high含义不再赘述。
返回的就是True False矩阵表示每个像素点是否被留下。
好了本文结束,感谢观看~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ中TTL

目录一、TTL1.控制后台演示消息过期2.代码实现2.1 队列统一过期2.2 消息过期一、TTL TTL 全称 Time To Live(存活时间/过期时间)。 当消息到达存活时间后,还没有被消费,会被自动清除。 RabbitMQ可以对消息设置过期时间&#xff0…

QT与Halcon联编应用开发-设置软件图标Icon

VS+Qt应用开发-设置软件图标 设置软件exe图标设置运行时标题栏和任务栏图标默认的Qt是没有图标的,如下图所示,可以在Qt应用程序发布时和应用程序运行时给应用程序加上图标。 任务栏图标: 软件左上角图标 可执行程序图标

原来count(*)是接口性能差的真凶

以下文章来源于苏三说技术 ,作者苏三呀 一.前言 最近我在公司优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有所帮助。 我们使用的数据库是Mysql8,使用的存储引擎是Innodb。这次优化除了优…

通过Chrome打开IE浏览器并跳转到指定页面并传递参数

通过Chrome打开IE浏览器并跳转到指定页面并传递参数 方式一:通过浏览器打开ie浏览器(可以换做其他应用),跳转到指定页面(方式一只支持单个参数) 1、新建alert.reg Windows Registry Editor Version 5.00…

IOC/DI的注解开发

IOC/DI注解开发3,IOC/DI注解开发3.1 环境准备3.2 注解开发定义bean步骤1:删除原XML配置步骤2:Dao上添加注解步骤3:配置Spring的注解包扫描步骤4:运行程序步骤5:Service上添加注解步骤6:运行程序知识点1:Component等3.2 纯注解开发模式3.2.1 思路分析3.2.…

https和ssl网关在各安全层面的应用场景及测评要点

1、https和https实现 SSL/TLS协议是独立的概念(这里的重点是https和ssl v**,关于ssl/tls协议就不展开说了),可以实现对基于TCP/UDP应用的安全保护,如https和sftp等。 https是其中应用非常广泛的一种,即Hype…

RocketMQ 5.1 NameServer 启动流程

文章目录1 解析命令行参数和配置文件2 创建并启动 NamesrvController2.1 创建 NamesrvController 对象2.2 启动 NamesrvController 对象第一步:初始化 controller第二步:注册 JVM 钩子第二步:启动 controllerRocketMQ是一个分布式消息中间件&…

爬虫学习(网页解析)

目录 了解: 参考图 介绍 bs4库: 解析器: 解析方法 代码示例 lxml库: 解析器 解析方法 代码示例 了解: 参考图 (1) html解析器: (2) 解析方式: 介绍 ### 前言: 网页…

财政分权数据集:省级地级市财政分权度(1999-2021年)

财政分权是指中央政府和地方政府在财政收入和支出方面各自拥有一定的自主权,即政府财政权力在中央和地方之间进行分割和分配的一种制度安排。财政分权的实施可以促进地方政府的责任感和创造力,提高政府的效率和服务水平,同时也可以增强地方政…

蓝桥杯嵌入式第十三届(第二套客观题)

文章目录 前言一、题目1二、题目2三、题目3四、题目4五、题目5六、题目6七、题目7八、题目8九、题目9十、题目10总结前言 本篇文章继续讲解客观题。 一、题目1 这个其实属于送分题,了解嵌入式或者以后想要入行嵌入式的同学应该都对嵌入式特点有所了解。 A. 采用专用微控制…

KDZD-JP简易式机械碰撞试验台

一、产品制作标准 依据高压开关标准要求制作:GB7251-2013《低压成套开关设备和控制设备》、GB3906-2006 《3.6KV-40.5KV 交流金属封闭开关设备和控制设备》、GB/T 11022—2011《高压开关设备和控制设备标准的共用技术要求》、GB/T 1984—2014 《高压交流断路器》、…

全网最细的自定义类型详解(结构体,枚举,联合),友友们快来接收吧

各位csdn的友友们肯定都掌握了c语言中char,short, int, long, float, double的类型,这些都是我们c语言中的一些内置类型,其实c语言是可以允许我们创造一些类型的,今天阿博就带领友友们一起掌握这些新的自定义类型😊😊&…

[Java Web]Session | 一文详细介绍会话跟踪技术中的Session

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:Java Web 目录Session1、介绍2、工作流程3、工作原理4、基本使用5、Session的钝化与活化5.1、提出问题5.2、&…

【C语言蓝桥杯每日一题】—— 递增序列

【C语言蓝桥杯每日一题】—— 递增序列😎前言🙌递增序列🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者…

软考中级-软件工程

1 软件过程1.1 能力成熟度模型(CMM)初始(混乱)->可重复(建立基本、重复以往)->已定义(文档化、标准化)->已管理(制定产品质量标准)->优化&#x…

HTML5 SSE

HTML5 服务器发送事件(Server-Sent Events) 服务器发送事件(Server-sent Events)是基于 WebSocket 协议的一种服务器向客户端发送事件和数据的单向通讯。 HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。…

快速将PDF转换为图片:免费的在线PDF转换器

在现代数字时代,PDF是一种非常常见的文件格式。它们在学术界,商业领域和许多其他领域中被广泛使用。有时,您可能需要将PDF文件转换为图像格式,以便能够方便地与他人共享和使用。在这种情况下,您可以使用免费的在线PDF转…

PyCharm 配置sqlite3驱动

在PyCharm中可以查看sqlite3数据库,具体要如何做呢? 数据库入口 打开PyCharm, 在最右侧,有一个Database的表示,点击如下图所示。 如果没有找到这个选项, 点击View -> Tool Windows -> Database同…

chatgpt实际是怎样工作的?

文章翻译自: https://www.assemblyai.com/blog/how-chatgpt-actually-works/ ChatGPT 是 OpenAI 的最新语言模型,比其前身 GPT-3 有了重大改进。与许多大型语言模型类似,ChatGPT 能够为不同目的生成多种样式的文本,但具有更高的精…

MBD-有感(Hall)开环BLDC控制模型(下)

目录 前面 保护策略 DC_Bus_Measurements Protection_Check 外设配置 最后 前面 上一篇已经把霍尔有感BLDC开环控制模型的主要部分分析完成了 MBD-有感(Hall)开环BLDC控制模型(上) 语雀 这一篇分析一些边边角角,但不成体系的部分。…
最新文章