この 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 中国語 Web サイトの他の関連記事を参照してください。