我需要完成三项任务:
- 正则化曲线
- 曲线的对称性
- 完成不完整的曲线
例如,这里是输入和预期的输出图像:
输入
输出| ||在一般设置中,形状可以由任何 SVG 曲线基元(贝塞尔曲线、直线、弧线)表示。为了统一表示,示例包含曲线的折线近似。这些折线保存为 CSV 文件。
以下是读取 CSV 文件的代码:
此代码将生成包含每个形状的列表。形状被编码为路径列表,其中每个路径都是定义折线的点的 numpy 数组。这是用于可视化形状的以下代码:
import numpy as np
def read_csv ( csv_path ):
np_path_XYs = np . genfromtxt ( csv_path , delimiter = ',')
path_XYs = []
for i in np . unique ( np_path_XYs [: , 0]):
npXYs = np_path_XYs [ np_path_XYs [: , 0] == i ][: , 1:]
XYs = []
for j in np . unique ( npXYs [: , 0]):
XY = npXYs [ npXYs [: , 0] == j ][: , 1:]
XYs . append ( XY )
path_XYs . append ( XYs )
return path_XYs
x = read_csv('/content/frag0.csv')
这是用作输入的 .csv 文件:
import numpy as np
import matplotlib . pyplot as plt
def plot (paths_XYs):
fig , ax = plt . subplots ( tight_layout = True , figsize =(8 , 8))
for i , XYs in enumerate (paths_XYs):
for XY in XYs :
ax . plot ( XY [: , 0] , XY [: , 1] , linewidth =2)
ax.set_aspect ('equal')
plt.show ()
plot(x)
输入 csv 文件
我想知道是否有任何库可以用来构建此项目?| ||任何建议都会有帮助
I wanna know if there are any libraries I can use to build this project ?
Any suggestions would be helpful
当然,可以使用一些 Python 库来平滑、对称化和完成不规则形状,例如提供的示例。以下是解决此问题的分步方法,以及如何使用流行库的代码示例:
1. 读取和准备数据:
已经提供了用于读取 CSV 文件的代码,这非常棒。我们将继续使用它:
```python import numpy as np import matplotlib.pyplot as plt
def read_csv(csv_path): np_path_XYs = np.genfromtxt(csv_path, delimiter=',') path_XYs = [] for i in np.unique(np_path_XYs[:, 0]): npXYs = np_path_XYs[np_path_XYs[:, 0] == i][:, 1:] XYs = [] for j in np.unique(npXYs[:, 0]): XY = npXYs[npXYs[:, 0] == j][:, 1:] XYs.append(XY) path_XYs.append(XYs) return path_XYs
x = read_csv('path_to_your_file.csv')
def plot(paths_XYs): fig, ax = plt.subplots(tight_layout=True, figsize=(8, 8)) for i, XYs in enumerate(paths_XYs): for XY in XYs: ax.plot(XY[:, 0], XY[:, 1], linewidth=2) ax.set_aspect('equal') plt.show()
plot(x) ```
2. 平滑曲线:
-
scipy.interpolate.splprep 和 scipy.interpolate.splev: 这些函数可用于使用 B 样条曲线平滑曲线。
```python from scipy.interpolate import splprep, splev
def smooth_curve(XY, s=0.5, k=3): """使用 B 样条曲线平滑曲线。
参数: XY:形状为 (n, 2) 的 NumPy 数组,表示曲线的点。 s:平滑因子。值越大,曲线越平滑。 k:B 样条曲线的阶数。 返回值: 形状为 (n, 2) 的 NumPy 数组,表示平滑曲线上的点。 """ tck, u = splprep([XY[:, 0], XY[:, 1]], s=s, k=k) u_new = np.linspace(u.min(), u.max(), 1000) x_new, y_new = splev(u_new, tck, der=0) return np.stack((x_new, y_new), axis=1)
smoothed_x = [] for path in x: smoothed_path = [] for curve in path: smoothed_curve = smooth_curve(curve, s=0.1, k=3) smoothed_path.append(smoothed_curve) smoothed_x.append(smoothed_path)
plot(smoothed_x) ```
3. 对称化曲线:
-
查找对称轴: 这部分比较棘手,需要了解曲线的预期对称性。如果形状应该具有垂直对称性,可以找到形状的“中心线”(例如,通过计算 x 坐标的平均值),并相对于该线反映曲线的一半。
```python def make_symmetric(XY, axis='vertical'): """使曲线相对于给定轴对称。
参数: XY:形状为 (n, 2) 的 NumPy 数组,表示曲线的点。 axis:对称轴。可以是 'vertical' 或 'horizontal'。 返回值: 形状为 (n, 2) 的 NumPy 数组,表示对称曲线上的点。 """ if axis == 'vertical': centerline = np.mean(XY[:, 0]) XY[:, 0] = 2 * centerline - XY[:, 0] elif axis == 'horizontal': centerline = np.mean(XY[:, 1]) XY[:, 1] = 2 * centerline - XY[:, 1] else: raise ValueError("轴必须是 'vertical' 或 'horizontal'") return XY
```
注意: 此
make_symmetric
函数假设希望相对于数据集中 x 坐标的平均值进行对称化。可能需要修改此功能以适合的特定需求。
4. 完成不完整的曲线:
-
插值: 如果缺失的部分很小,可以使用插值来完成曲线。可以使用
scipy.interpolate.splprep
和scipy.interpolate.splev
(如平滑步骤中所述)或其他插值技术。``python # 如果需要,可以在应用
make_symmetric函数之前或之后使用
smooth_curve` 函数来平滑曲线 symmetrized_x = [] for path in smoothed_x: symmetrized_path = [] for curve in path: symmetrized_curve = make_symmetric(curve, axis='vertical') symmetrized_path.append(symmetrized_curve) symmetrized_x.append(symmetrized_path)plot(symmetrized_x) ```
5. 可视化结果:
-
使用 matplotlib 库显示结果。
python #...(现有的 plot 函数代码)...
请记住,这些步骤提供了针对曲线平滑、对称和完成的通用方法。可能需要调整代码和参数以适合的特定数据集和所需结果。 例如,查找对称轴和完成曲线的方法在很大程度上取决于数据的特定特征。
此外,请探索其他库以获取更高级的图像处理和形状分析技术:
- OpenCV (cv2): 广泛用于图像处理和计算机视觉任务的强大库。
- Scikit-image: 用于图像处理的另一个很棒的库,提供了分割、特征提取和形状分析算法。
希望本指南为提供了一个良好的开端!如果有任何更具体的问题或需要帮助来调整代码以适应的数据集,请告诉我。
标签:python,matplotlib,plot From: 78808777