python - 平滑一个颠簸的圆圈
问题描述
我正在检测圆形物体的边缘并获得“凹凸不平”的不规则边缘。是否可以平滑边缘以使我的形状更均匀?
例如,在下面的代码中,我生成了一个“凹凸不平”的圆圈(左)。是否有一种平滑或移动平均函数可以用来获得或近似“平滑”圆(右)。最好使用我可以控制的某种参数,因为我的实际图像不是完美的圆形。
import numpy as np
import matplotlib.pyplot as plt
fig, (bumpy, smooth) = plt.subplots(ncols=2, figsize=(14, 7))
an = np.linspace(0, 2 * np.pi, 100)
bumpy.plot(3 * np.cos(an) + np.random.normal(0,.03,100), 3 * np.sin(an) + np.random.normal(0,.03,100))
smooth.plot(3 * np.cos(an), 3 * np.sin(an))
解决方案
您可以在频域中执行此操作。取(x,y)
曲线点的坐标并将信号构造为signal = x + yj
,然后对该信号进行傅里叶变换。过滤掉高频成分,然后进行傅里叶逆变换,你会得到一条平滑的曲线。您可以通过调整截止频率来控制平滑度。
这是一个例子:
import numpy as np
from matplotlib import pyplot as plt
r = 3
theta = np.linspace(0, 2 * np.pi, 100)
noise_level = 2
# construct the signal
x = r * np.cos(theta) + noise_level * np.random.normal(0,.03,100)
y = r * np.sin(theta) + noise_level * np.random.normal(0,.03,100)
signal = x + 1j*y
# FFT and frequencies
fft = np.fft.fft(signal)
freq = np.fft.fftfreq(signal.shape[-1])
# filter
cutoff = 0.1
fft[np.abs(freq) > cutoff] = 0
# IFFT
signal_filt = np.fft.ifft(fft)
plt.figure()
plt.subplot(121)
plt.axis('equal')
plt.plot(x, y, label='Noisy')
plt.subplot(122)
plt.axis('equal')
plt.plot(signal_filt.real, signal_filt.imag, label='Smooth')
推荐阅读
- excel-formula - 从日期列表中基于条件的日期计数
- java - java中的反向波兰语到中缀表示法优化
- javascript - 使用 JQuery On Change 事件访问多个元素数据属性
- elasticsearch - Elasticsearch查询数字的字符串表示
- java - LibGDX 项目无法在我的安卓设备上运行
- java - 获取数组列表
来自 SQLite - django - Django:在下拉选择中显示文本字段
- python - 如何在python中读取没有特定符号的数据?
- c# - Task.Delay 运行时我无法关闭程序
- javascript - D3 --> 反应翻译