图像处理--归一化切割--(normalized cut)--Python实现

归一化切割是用于图像分割的分群技术,将图像视为图,并计算权重图进行分割。通过理解图、权重图以及分割的概念,文章详细解释了归一化切割的原理,包括最小化分割的局限性和Ncut的优化。通过矩阵运算解决特征值问题来找到分割点,实现图像分割。文中还提供了Python代码示例,并比较了不同求解方法的时间效率。
摘要由CSDN通过智能技术生成

归一化切割Normalized cut 是一种分群(cluster grouping)技术,在数据处理和图像处理方面有很广的运用

用其实现图像分割的思路是,把一个图片看成一个图(graph), 然后计算权重图(weighted graph),然后分割成一些具有相同特征(纹理, 颜色,明度等)的区域。

想要理解代码的含义,首先要先要理解一些基本的概念:

1.什么是图(graph)?

我们定义G = (V, E), 其中,V是顶点(vertex), E是边(edge)。

2.什么是权重图(weighted graph)

就是边(edge)上有权重(weight)的图,如下图所示:


                               (图1)               

我们把这个图分成两个子集左侧的A和右侧的B, 通过观察,A由4个顶点组成,B由5个顶点组成。需要注意的是,同属于一个子集中的顶点之间的边的权重的值相对来说会大一些。子集与子集直接的点的边上的权重会小, 这个特性也就是normalized cut能分割区域的基础了。这张图表示是,相近的点之间的权重大。但是实际运用中,距离并不是衡量权重的唯一标准。如何计算权重是具体项目具体设计的了。

想要理解normalized cut 需要先理解什么是分割(cut)与最小化分割(min cut)

我这里用相对数学一点的表述方式:

把G = (V,E) 分成两个子集A,B,另:



其中,  就是权重(weight), 最小化分割就是让上式的值最小的分割。如何理解这个过程?

拿图一做例子,我们把图一看成一个整体G,目的是把它分成两个部分。显然中间的两条权重为0.1的边就是最小化切割。最小化分割很完美的就解决了把这个G分成两部分的任务,但是问题来了如下图(图2)所示,最小化切割性能就不很好了。


                    (图2)

可以看到,图2所示的情况,想要的结果是中间虚线表示的分割,但是最小化切割却切掉了最边缘的角。这很容易理解,因为最小化切割就是让cut(A,B)的值最小的情况,而边缘处cut值确实是最小。因此我们称最小化切割时有偏差的(bias)。如何去除这种偏差就要引入我们这篇文章的主角归一化切割了。


其中:


assoc(A,V)的含义是A中所有点到图中做有点的权重的和。通过上面的公式我们可以很清晰的看到Ncut在追求不同子集间点的权重最小值的同时也追求同一子集间点的权重最大值

至此,数学含义已经讲的差不多了,但是如果想要写成代码,我们需要用矩阵数学的知识重新把normalized cut解释一遍。

  • 44
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
以下是Python实现肌电信号低通滤波和归一化处理的示例代码: ```python import numpy as np from scipy import signal # 定义低通滤波器 def butter_lowpass(cutoff, fs, order=5): nyq = 0.5 * fs normal_cutoff = cutoff / nyq b, a = signal.butter(order, normal_cutoff, btype='low', analog=False) return b, a # 定义归一化函数 def normalize(signal): max_val = np.max(signal) min_val = np.min(signal) return (signal - min_val) / (max_val - min_val) # 读取肌电信号数据 signal_data = np.loadtxt('emg_signal.txt') # 设定采样率和截止频率 fs = 1000.0 cutoff_freq = 50.0 # 应用低通滤波器 b, a = butter_lowpass(cutoff_freq, fs) filtered_signal = signal.filtfilt(b, a, signal_data) # 应用归一化处理 normalized_signal = normalize(filtered_signal) # 输出处理后的信号 print(normalized_signal) ``` 在上述代码中,我们首先定义了一个`butter_lowpass`函数,用于创建一个低通滤波器。该函数使用`scipy.signal.butter`函数来生成一个巴特沃斯滤波器系数,然后返回这些系数。 接下来,我们定义了一个`normalize`函数,用于将信号归一化到0到1之间。该函数使用`numpy`库中的`max`和`min`函数来计算信号的最大值和最小值,并将信号减去最小值并除以最大值减去最小值。 然后,我们从文件中读取肌电信号数据,并设定采样率和截止频率。我们使用`butter_lowpass`函数来创建一个低通滤波器,并使用`scipy.signal.filtfilt`函数来应用该滤波器以对信号进行滤波。最后,我们使用`normalize`函数将滤波后的信号归一化到0到1之间,并输出结果。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值