点图像简化.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. from shapely.geometry import Polygon, Point
  2. # 你提供的原始坐标点
  3. points_raw = [
  4. [
  5. 484,
  6. 2686
  7. ],
  8. [
  9. 484,
  10. 2693
  11. ],
  12. [
  13. 485,
  14. 2694
  15. ],
  16. [
  17. 485,
  18. 2697
  19. ],
  20. [
  21. 486,
  22. 2698
  23. ],
  24. [
  25. 486,
  26. 2702
  27. ],
  28. [
  29. 487,
  30. 2703
  31. ],
  32. [
  33. 487,
  34. 2705
  35. ],
  36. [
  37. 488,
  38. 2706
  39. ],
  40. [
  41. 488,
  42. 2709
  43. ],
  44. [
  45. 489,
  46. 2710
  47. ],
  48. [
  49. 489,
  50. 2714
  51. ],
  52. [
  53. 490,
  54. 2715
  55. ],
  56. [
  57. 490,
  58. 2717
  59. ],
  60. [
  61. 491,
  62. 2718
  63. ],
  64. [
  65. 491,
  66. 2722
  67. ],
  68. [
  69. 492,
  70. 2723
  71. ],
  72. [
  73. 492,
  74. 2725
  75. ],
  76. [
  77. 499,
  78. 2732
  79. ],
  80. [
  81. 500,
  82. 2732
  83. ],
  84. [
  85. 500,
  86. 2731
  87. ],
  88. [
  89. 501,
  90. 2730
  91. ],
  92. [
  93. 501,
  94. 2729
  95. ],
  96. [
  97. 502,
  98. 2728
  99. ],
  100. [
  101. 502,
  102. 2711
  103. ],
  104. [
  105. 501,
  106. 2710
  107. ],
  108. [
  109. 501,
  110. 2709
  111. ],
  112. [
  113. 500,
  114. 2708
  115. ],
  116. [
  117. 500,
  118. 2707
  119. ],
  120. [
  121. 499,
  122. 2706
  123. ],
  124. [
  125. 499,
  126. 2705
  127. ],
  128. [
  129. 498,
  130. 2704
  131. ],
  132. [
  133. 498,
  134. 2703
  135. ],
  136. [
  137. 497,
  138. 2702
  139. ],
  140. [
  141. 497,
  142. 2699
  143. ],
  144. [
  145. 496,
  146. 2698
  147. ],
  148. [
  149. 496,
  150. 2696
  151. ],
  152. [
  153. 495,
  154. 2695
  155. ],
  156. [
  157. 495,
  158. 2693
  159. ],
  160. [
  161. 494,
  162. 2692
  163. ],
  164. [
  165. 494,
  166. 2691
  167. ],
  168. [
  169. 491,
  170. 2688
  171. ],
  172. [
  173. 488,
  174. 2688
  175. ],
  176. [
  177. 487,
  178. 2687
  179. ],
  180. [
  181. 485,
  182. 2687
  183. ]
  184. ]
  185. # 1. 创建一个 Shapely Polygon 对象
  186. original_polygon = Polygon(points_raw)
  187. print(f"原始点数量: {len(points_raw)}")
  188. print(f"原始多边形面积: {original_polygon.area:.2f}")
  189. print("-" * 30)
  190. # 2. 使用 .simplify() 方法进行简化
  191. # tolerance 参数就是 RDP 算法的阈值(epsilon)
  192. # 它决定了简化的程度,单位与你的坐标单位相同。
  193. # 你需要根据实际情况调整这个值。
  194. # 尝试一个较小的 tolerance
  195. tolerance_small = 0.8
  196. simplified_polygon_small = original_polygon.simplify(tolerance_small, preserve_topology=True)
  197. points_small = list(simplified_polygon_small.exterior.coords)
  198. print(f"使用 tolerance = {tolerance_small}")
  199. print(f"简化后点数量: {len(points_small)}")
  200. print(f"简化后多边形面积: {simplified_polygon_small.area:.2f}")
  201. # 将点坐标转换为整数列表
  202. points_small_int = [[int(x), int(y)] for x, y in points_small]
  203. print("简化后的点:", points_small_int)
  204. print("-" * 30)
  205. # 尝试一个较大的 tolerance
  206. tolerance_large = 2.0
  207. simplified_polygon_large = original_polygon.simplify(tolerance_large, preserve_topology=True)
  208. points_large = list(simplified_polygon_large.exterior.coords)
  209. print(f"使用 tolerance = {tolerance_large}")
  210. print(f"简化后点数量: {len(points_large)}")
  211. print(f"简化后多边形面积: {simplified_polygon_large.area:.2f}")
  212. # 将点坐标转换为整数列表
  213. points_large_int = [[int(x), int(y)] for x, y in points_large]
  214. print("简化后的点:", points_large_int)
  215. print("-" * 30)