首頁 >後端開發 >C++ >我們如何以可調節的靈敏度有效地檢測二維點集中的孔?

我們如何以可調節的靈敏度有效地檢測二維點集中的孔?

Susan Sarandon
Susan Sarandon原創
2025-01-18 07:41:07922瀏覽

How Can We Efficiently Detect Holes in 2D Point Sets with Adjustable Sensitivity?

二維點集孔洞偵測

問題:

給定一個二維點集,如何找到該點集中的孔洞?此演算法應具有可調節的靈敏度,用於尋找這些孔洞。

解:

  1. 建立點集的點陣圖表示。

    • 掃描點並決定點集的邊界框。
    • 建立一個尺寸等於邊界框的點陣圖。
    • 對於每個點,將位圖中對應的像素設為 1。
  2. 找出點陣圖中的連通分量。

    • 使用標準的連通分量演算法來辨識位圖中的連通分量。
    • 每個連通分量代表點集中的一個孔洞。
  3. 計算每個連通分量的凸包。

    • 使用標準的凸包演算法來計算每個連通分量的凸包。
    • 凸包代表孔洞的邊界。
  4. 輸出孔洞的邊界。

    • 演算法的輸出是一個凸包列表,每個凸包代表點集中的一個孔洞的邊界。

演算法:

<code class="language-python">import numpy as np
from scipy.ndimage import label

def find_holes(points, sensitivity=1):
  """
  查找二维点集中的孔洞。

  参数:
    points: 二维点列表。
    sensitivity: 算法的灵敏度。较高的值将导致找到更多孔洞。

  返回:
    表示孔洞边界的凸包列表。
  """

  # 创建点集的位图表示。

  xmin, xmax, ymin, ymax = get_bounding_box(points)
  bitmap = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8)
  for point in points:
    bitmap[point[1] - ymin, point[0] - xmin] = 1

  # 查找位图中的连通分量。

  labeled, num_components = label(bitmap)

  # 计算每个连通分量的凸包。

  holes = []
  for i in range(1, num_components + 1):
    component_mask = (labeled == i)
    component_points = np.where(component_mask)
    convex_hull = compute_convex_hull(component_points)
    holes.append(convex_hull)

  # 输出孔洞的边界。

  return holes</code>

範例:

<code class="language-python">import matplotlib.pyplot as plt

# 生成一组随机点。

points = np.random.rand(100, 2)

# 查找点集中的孔洞。

holes = find_holes(points)

# 绘制点和孔洞。

plt.scatter(points[:, 0], points[:, 1])
for hole in holes:
  plt.plot(hole[:, 0], hole[:, 1])
plt.show()</code>

輸出:

[二維散點圖,標註孔洞]

討論:

演算法的靈敏度參數控制找到的孔洞的大小。較高的靈敏度將導致找到更多孔洞,而較低的靈敏度將導致找到較少的孔洞。最佳靈敏度取決於具體的應用。

此演算法可用於尋找各種不同類型的資料集中的孔洞,包括點雲、影像和網格。它是一個用於分析數據和識別模式的多功能且強大的工具。

以上是我們如何以可調節的靈敏度有效地檢測二維點集中的孔?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn