当前位置: 首页 > news >正文

skimage.filters.apply_hysteresis_threshold详解

本文内容均参考scipy1.9.1scipy1.9.1scipy1.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 toa 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 toa 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 highmask_low = image > lowmask_high = image > high# Connected components of mask_lowlabels_low, num_labels = ndi.label(mask_low)# Check which connected components contain pixels from mask_highsums = ndi.sum(mask_high, labels_low, np.arange(num_labels + 1))connected_to_high = sums > 0thresholded = connected_to_high[labels_low]return thresholded

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

    mask_low = image > lowmask_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 compatibilityreasons, 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矩阵表示每个像素点是否被留下。
好了本文结束,感谢观看~

相关文章:

skimage.filters.apply_hysteresis_threshold详解

本文内容均参考scipy1.9.1scipy1.9.1scipy1.9.1版本的源码,若有任何不当欢迎指出 我们截取官方注释如下: def apply_hysteresis_threshold(image, low, high):"""Apply hysteresis thresholding to image.This algorithm finds regions …...

一、基础算法5:前缀和与差分 模板题+算法模板(前缀和,子矩阵的和,差分,差分矩阵)

文章目录算法模板前缀和模板子矩阵的和模板差分模板差分矩阵模板模板题前缀和原题链接题目题解子矩阵的和原题链接题目题解差分原题链接题目题解差分矩阵原题链接题目题解算法模板 前缀和模板 S[i] a[1] a[2] ... a[i] a[l] ... a[r] S[r] - S[l - 1]子矩阵的和模板 S[i…...

Python矩阵分解之QR分解

文章目录QR和RQ分解其他函数QR和RQ分解 记AAA为方阵,P,QP, QP,Q分别为正交单位阵和上三角阵,则形如AQRAQRAQR的分解为QR分解;形如ARQARQARQ的分解为RQ分解。 在scipy.linalg中,为二者提供了相同的参数,除了待分解矩阵…...

随机森林程序

n_estimators:数值型取值 含义:森林中决策树的个数,默认是10 criterion:字符型取值 含义:采用何种方法度量分裂质量,信息熵或者基尼指数,默认是基尼指数 max_features:取值为int型, float型, string类型…...

每日一练2627——变态跳台阶快到碗里来不用加减乘除做加法三角形

文章目录变态跳台阶思路:代码:快到碗里来思路:代码:不用加减乘除做加法思路:代码:三角形思路:代码:变态跳台阶 题目链接: 思路: 这个题目很容易理解&#…...

LeetCode-146. LRU 缓存

目录LRU理论题目思路代码实现一代码实现二题目来源 146. LRU 缓存 LRU理论 LRU 是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次被使用。而最近很少被使用的数据,很大概率下一次不再用到。当缓…...

#课程笔记# 电路与电子技术基础 课堂笔记 第3章 电路分析的几个定理

3.1 叠加定理 激励:电流源或电压源 响应:电流或电压 叠加定理一般用于已知激励或响应中的一种,求另一种。做法就是,每次只求一个激励作用下的响应,将其他激励置零,置零的具体做法是,电压源变…...

推迟参数设计的自适应反步控制和自适应神经网络的反步控制设计

推迟参数设计的自适应反步控制和自适应神经网络的反步控制设计 目录推迟参数设计的自适应反步控制和自适应神经网络的反步控制设计前言匹配与非匹配1. 基于自适应反步控制的非匹配条件下的系统控制器设计问题描述控制器设计小结2. 基于自适应反步控制和推迟参数设计的非匹配条件…...

spring5.1+SmartInstantiationAwareBeanPostProcessor 解决循环依赖

SmartInstantiationAwareBeanPostProcessor 解决循环依赖的过程, 例如上面的 A依赖B, B依赖A SmartInstantiationAwareBeanPostProcessor 是 Spring 中的一个接口,它扩展了 InstantiationAwareBeanPostProcessor 接口并提供了对 Bean 的实例化和属性填充的更高级的…...

apply、call与bind

共同点: 都是函数对象的一个方法,作用是改变函数执行时的上下文,即改变函数体内部this的指向 var name "lucy"; var obj {name: "martin",say: function () {console.log(this.name);} }; obj.say(); // martin&…...

《Effective Objective-C 2.0 》 阅读笔记 item3

第3条:多用字面量语法,少用与之等价的方法 1. 字面数值 使用字面量能令代码更为简洁: NSNumber *someNumber 1; *** 字面量语法的好处! *** 令代码更为简洁。能够以NSNumber实例表示的所有数据类型(int、float、d…...

SSL/TLS 证书管理

SSL 证书发现 随着组织的 IT 基础架构的扩展,他们为每台计算机获取证书以保护其资源和域。此外,开发人员通常会创建许多自签名证书,以便在产品的开发阶段保护内部网络。组织通常最终会拥有数千个证书。自动发现证书提供了对证书基础结构的完…...

supersqli(SQL注入流程及常用SQL语句)

目录 一、SQL注入知识学习 1、判断注入类型 (1)数字型注入判断 (2)字符型注入判断 2、猜解sql查询语句中的字段数(order by 的使用) 3、判断显示位爆数据库的名字 4、注释(--的使用&#…...

【数据结构】用Java实现一棵二叉树

目录 前言 1. 创建MyBinaryTree类 2. 从前序与中序遍历序列构造二叉树 3. 从中序与后序遍历序列构造二叉树 4. 用层序遍历验证二叉树是否构建成功 5. 整体代码(构建二叉树、二叉树的基本功能和测试代码) 6. 测试结果 前言 前面两篇文章已经给出了…...

【面试】面试官问的几率较大的网络安全面试题

文章目录防范常见的 Web 攻击1、什么是SQL注入攻击2、什么是XSS攻击3、什么是CSRF攻击4、什么是文件上传漏洞5、DDos 攻击重要协议分布图1、arp协议的工作原理ARP协议工作原理:2、什么是RARP?工作原理3、dns是什么?dns的工作原理4、rip协议是…...

[Python] 循环语句

循环语句就是在符合条件的情况下,重复执行一个代码段 1.while循环 while语句可用于在条件为真时反复执行代码块 语法格式 while 条件语句:执行语句 当条件语句为真(True)时,就会执行while循环下的语句 示例 实现1到100 的累加并输出求和结果 …...

计算机网络考试复习——第一章 1.5 1.6

1.5 计算机网络的类别 1.5.1计算机网络的定义: 系统集合,连接起来,协议工作,资源共享 计算机网络主要是由一些通用的、可编程的硬件互连而成的,而这些硬件并非专门用来实现某一特定目的(例如&#xff0…...

3.29 最小生成树算法

最小生成树概念 参考:什么是最小生成树? Minimum Spanning Tree 何为生成树? 生成树是指一个联通图的极小的连通子图,它包含了图中的所有n个顶点,并只有n-1条边(构成一棵树) 生成树的一些性…...

计算机科班与培训开发编程的区别在哪里?

科班、培训班、科班培训班的模式都培养了很多编程技术人员进入IT行业,有的成为某个技术领域的专家,有的成为领导层,有的一直在默默无闻的敲代码等待35岁的到来。不管那种方式入行,这些类似的情况都存在,并且未来还会一…...

idea设置常用自设置快捷键及坐标

<!--mybatis 依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency…...

Vue 3.0 实例方法

#$watch 参数&#xff1a;{string | Function} source{Function | Object} callback{Object} [options] {boolean} deep{boolean} immediate{string} flush返回&#xff1a;{Function} unwatch用法&#xff1a; 侦听组件实例上的响应式 property 或函数计算结果的变化。回调函数…...

日撸 Java 三百行day1-10

文章目录说明day1 环境搭建1.1 开发环境1.2 package import 和 println1.3 编写HelloWorld.javaday2 基本算术操作2.1 加、减、乘、除、整除、取余.day3 基本if 语句3.1 if条件分支语句3.2 代码day4 闰年的计算4.1 思路整理&#xff1a;何为闰年&#xff1f;4.2 核心代码day5 基…...

Ubuntu Instant-ngp 训练自有数据集

1. 运行环境配置 conda create -n instant-ngp python3.10 conda activate instant-ngp pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple2. COLMAP稀疏重建生成transform.json colmap 环境配置参考文档&#xff1b; 终端定位在instant-ngp/da…...

k8s集群只一台节点,重启节点后命名空间找不到了

定位 如果您的Kubernetes集群只有一台节点&#xff0c;并且在重启节点之前您创建了一些命名空间和资源&#xff0c;那么在节点重启后&#xff0c;这些命名空间和资源可能会丢失。这是因为在Kubernetes中&#xff0c;资源和命名空间通常是存储在etcd中的。当节点重启时&#xf…...

MarkDown示例

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

spring cloud 雪崩效应

什么是雪崩效应 雪崩就是塌方。在山坡上的积雪&#xff0c;如果积雪的内聚力小于重力或其他力量&#xff0c;则积雪便向下滑动&#xff0c;从而逐渐引起积雪的崩塌。 在微服务架构中&#xff0c;服务之间通常存在级联调用。比如&#xff0c;服务A调用服务B&#xff0c;而服…...

Python 自动化指南(繁琐工作自动化)第二版:三、函数

原文&#xff1a;https://automatetheboringstuff.com/2e/chapter3/ 您已经熟悉了前几章中的print()、input()和len()函数。Python 提供了几个这样的内置函数&#xff0c;但是您也可以编写自己的函数。函数就像一个程序中的一个小程序。 为了更好地理解函数是如何工作的&#…...

c++多线程 1

https://www.runoob.com/cplusplus/cpp-multithreading.html 两种类型的多任务处理&#xff1a;基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。 基于线程的多任务处理是同一程序的片段的并发执行。 线程 c11以后有了 标准库 1 函数 2 类成员函数 3 lambda函…...

STM32F103制作FlashDriver

文章目录前言芯片内存定义实现过程FlashDriver生成段定义擦除函数写入函数编译后的map手动测试HexView提取指定地址内容并重映射总结前言 在汽车行业控制器软件刷新流程中&#xff0c;一般会将Flash驱动单独进行刷写&#xff0c;目的是防止程序中一直存在Flash驱动的话&#x…...

springboot树形结构接口, 懒加载实现

数据库关系有父子id的, 作为菜单栏展示时需要用前端需要用到懒加载, 所谓懒加载就是接口有一个标志位isLeaf, 前端请求后通过该字段判断该节点是否还有子节点数据 创建数据库表 t_company_info结构有id和parentId标识, 用来表示父子关系 /*Navicat Premium Data TransferSourc…...