此 Python 程式碼提供了類似於上一個答案中描述的點陣圖向量方法的實作。它透過計算位圖中的資料密度、識別未使用的區域、分割輸出並對結果進行多邊形化來尋找一組 2D 點中的孔。
import numpy as np import cv2 import matplotlib.pyplot as plt def find_holes(points, resolution=100): """Find holes in a set of 2D points. Args: points: A list of (x, y) tuples representing the points. resolution: The resolution of the bitmap to use. Higher resolution results in more accurate results, but is slower. Returns: A list of (x, y) tuples representing the vertices of the holes. """ # Create a bitmap of the points. bitmap = np.zeros((resolution, resolution), dtype=np.uint8) for point in points: x, y = point bitmap[int(y * resolution), int(x * resolution)] = 255 # Compute data density in the bitmap. density = cv2.dilate(bitmap, np.ones((3, 3))) - cv2.erode(bitmap, np.ones((3, 3))) # Identify unused areas in the bitmap. unused_areas = np.where(density == 0) # Segment the unused areas. segmented_areas = cv2.watershed(density, np.zeros((resolution, resolution), dtype=np.int32), markers=unused_areas[0], mask=bitmap) # Polygonize the segmented areas. holes = [] for i in range(1, np.max(segmented_areas) + 1): mask = np.zeros((resolution, resolution), dtype=np.uint8) mask[segmented_areas == i] = 255 _, contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: hole = [] for point in contour: x, y = point[0] hole.append((x / resolution, y / resolution)) holes.append(hole) return holes # Example usage # Generate a set of random points. points = [(np.random.rand(), np.random.rand()) for _ in range(1000)] # Find the holes in the set of points. holes = find_holes(points, resolution=50) # Plot the points and the holes. plt.scatter([x for (x, y) in points], [y for (x, y) in points], s=1, c='black') for hole in holes: plt.plot([x for (x, y) in hole], [y for (x, y) in hole], c='red') plt.show()
此程式碼使用 OpenCV 進行點陣圖操作,使用 NumPy 進行陣列操作操作,以及用於繪圖的 matplotlib。它可以輕鬆修改以使用不同的資料類型和座標系。
以上是如何使用 Python 中的點陣圖和向量方法有效地檢測和勾畫一組分散的 2D 點中的孔?的詳細內容。更多資訊請關注PHP中文網其他相關文章!