gpt4 book ai didi

python - 平滑一个凹凸不平的圆圈

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:19 24 4
gpt4 key购买 nike

我正在检测圆形物体的边缘并获得“凹凸不平”的不规则边缘。有没有办法平滑边缘,使我的形状更均匀?

例如,在下面的代码中,我生成了一个“颠簸”的圆圈(左)。是否有一种平滑或移动平均函数可以用来获得或近似“平滑”圆(右)。最好使用某种我可以控制的参数,因为我的实际图像不是完美的圆形。

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))

bumpy and smooth circle

最佳答案

您可以在频域中执行此操作。获取曲线点的 (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')

figure

关于python - 平滑一个凹凸不平的圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51259361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com