首页 > 编程问答 >使用 Python 平滑和对称不规则形状和曲线

使用 Python 平滑和对称不规则形状和曲线

时间:2024-07-30 03:51:16浏览次数:11  
标签:python matplotlib plot

我需要完成三项任务:

  1. 正则化曲线
  2. 曲线的对称性
  3. 完成不完整的曲线

例如,这里是输入和预期的输出图像:
输入

输出| ||在一般设置中,形状可以由任何 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

相关文章

  • 在Python中通过绝对路径引用数据文件夹
    我有一个大型python项目,其中数据太大,无法每次都以相同的方式共享。不同的人可能会使用网络位置或将某些内容复制到本地驱动器。该路径由不同子文件夹中的脚本和笔记本使用。例如,我将创建一个config.py来定义数据文件夹的路径。importsyssys.path.append('../'......
  • python三天速成记(看完你就会)day3 满满干货~
    续上文啦~EXCEL表的操作上一篇文章讲了怎么读取和操作txt和csv文档,但其实我们生活中还有一个常用的文本格式那就是excel文件,特别是在对大量数据进行处理的时候。excel文件的用处和广泛。其实在python中有很多库可以处理excel文件,但是本文主要介绍使用最实用最广泛的库pan......
  • Python输入验证改进的其他方式
    题目[题目来源:Python编程快速上手——让繁琐工作自动化(第二版)第三章实践项目,下面的解答程序为我自己完成的,仅供参考。]编写一个名为collatz()的函数,他有一个名为number的参数。如果参数是偶数,那么collatz()就输出number//2,并返回该值。如果参数是奇数,那么collatz()就......
  • Python的PyInputPlus模块
    PyInputPlus模块简介PyInputPlus模块的功能:PyInputPlus模块是一个Python第三方模块,需要自己对它进行安装。包含与input()函数类似的、用于多种数据(如日期、数字、电子邮箱地址等)的函数。如果,用户输入了无效的内容,例如格式错误的日期或超过预期范围的数字,那么PyInputPlus模......
  • 用Python实现二进制搜索(二分查找)
    二进制搜索(binarysearch,又称二分搜索)是一种快速有效的搜索方法,用于搜索有序列表中的元素。importmathdefbinary_search(sorted_list,target):"""在有序列表sorted_list中查找目标值target的位置使用二分查找算法"""lower_bound=0#初始......
  • 超详细Python教程——使用Hexo搭建自己的博客
    使用Hexo搭建自己的博客对于一个程序员来说,搭建一个属于自己的博客平台是非常有意义的事情。首先,博客可以记录自己的成长历程,也是对自己一段时间学习和工作的总结和沉淀;其他,通过博客可以营销自己,增强自己在互联网或行业内的影响力,为将来更好的职业生涯打一个坚实的基础。前......
  • 超详细Python教程——玩转PyCharm
    玩转PyCharmPyCharm是由JetBrains公司开发的提供给Python专业的开发者的一个集成开发环境,它最大的优点是能够大大提升Python开发者的工作效率,为开发者集成了很多用起来非常顺手的功能,包括代码调试、高亮语法、代码跳转、智能提示、自动补全、单元测试、版本控制等等。此外,P......
  • 2024年华为OD机试真题-找出作弊的人-(C++/Java/python)-OD统一考试(C卷D卷)
    2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】  题目描述公司组织了一次考试,现在考试结果出来了,想看一下有没人存在作弊行为,但是员工太多了,需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。过滤的规则为:找到分差最小的员工ID对(p1,p2)列表,......
  • Shopee虾皮api python获取虾皮购物平台的商品数据信息 数据采集
    虾皮购物(英语:Shopee)是一个电商平台,总公司设在新加坡,归属于SeaGroup(之前称之为Garena),该企业于2009年由李小冬(ForrestLi)创办。虾皮购物于2015年初次在新加坡推出,现阶段已拓展到马来西亚、泰国、印度尼西亚、越南和菲律宾。虾皮购物为全球华人地区的客户提供线上购物和销售......
  • 2024华为OD机试真题- 亲子游戏Python-C卷D卷-200分
    2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++)题目描述宝宝和妈妈参加亲子游戏,在一个二维矩阵(N*N)的格子地图上,宝宝和妈妈抽签决定各自的位置,地图上每个格子有不同的糖果数量,部分格子有障碍物。游戏规则是妈妈必须在最短的时间(每个单位时间只能走一步)到达宝宝的位置,路上......