此 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中文网其他相关文章!