将SVG图像转换为Luxor/Javis路径并实现傅里叶变换绘图
把光栅图转矢量路径并通过傅里叶变换绘制的步骤
你提供的是PNG光栅图像,需要先转成矢量路径,再处理成pathtopoly()可用的数据,最后做傅里叶变换绘制,具体步骤如下:
1. 光栅图转SVG矢量路径
- 用Inkscape处理:导入PNG文件,点击「路径>从位图跟踪」,调整阈值、平滑度等参数生成矢量路径,导出为SVG后,提取文件中
<path>标签的d属性值(这就是路径数据)。 - 在线工具处理:用基于Potrace的在线转换器,上传PNG生成SVG路径,直接复制路径的
d属性内容。
2. 转成pathtopoly()兼容的顶点数据
pathtopoly()需要连续的(x,y)顶点序列,可通过代码解析SVG路径:
from svgpathtools import parse_path # 替换为你拿到的SVG路径d属性内容 svg_path_data = "Mxxx,xxx Lxxx,xxx ..." path = parse_path(svg_path_data) # 采样路径生成顶点(num_points控制精度,值越高越精细) num_sample_points = 1000 vertex_list = [] for idx in range(num_sample_points): t = idx / (num_sample_points - 1) point = path.point(t) vertex_list.append((point.real, point.imag)) # vertex_list就是pathtopoly()可用的多边形顶点数据
3. 傅里叶变换绘制图像
基于顶点数据做傅里叶变换重构曲线:
import numpy as np # 将顶点转为复数数组(x为实部,y为虚部) complex_curve = np.array([x + y * 1j for x, y in vertex_list]) # 计算离散傅里叶变换 fft_coefficients = np.fft.fft(complex_curve) # 截断系数控制绘制精度(保留前N个和后N个系数) keep_num = 50 truncated_coeffs = np.zeros_like(fft_coefficients) truncated_coeffs[:keep_num] = fft_coefficients[:keep_num] truncated_coeffs[-keep_num+1:] = fft_coefficients[-keep_num+1:] # 逆变换重构曲线 reconstructed_curve = np.fft.ifft(truncated_coeffs) # 提取坐标用于绘制 x_recon = reconstructed_curve.real y_recon = reconstructed_curve.imag
内容的提问来源于stack exchange,提问作者BuddhiLW
相关产品推荐
相关产品推荐

