python Shapely包使用,实现多边形iou
python Shapely 使用指南
剛從學習了Shapely包使用,怕忘記,在這里記錄一下。
閱讀目錄
1、引入包
from shapely.geometry import Point
from shapely.geometry import LineString
2、共有的變量和方法
object.area
Returns the area (float) of the object.
object.bounds
返回對象的(minx,miny,maxx,maxy)元組(float類型)
object.length
返回對象的長度
object.geom_type
返回對象類型
object.distance(other)
返回本對象和另一個對象的距離
object.representative_point()
Returns a cheaply computed point that is guaranteed to be within the geometric object.
>>> from shapely.geometry import Point >>> print Point(0,0).distance(Point(0,1)) 1.0 >>> from shapely.geometry import LineString >>> line = LineString([(0,0), (1,1), (1,2)]) >>> line.area 0.0 >>> line.bounds (0.0, 0.0, 1.0, 2.0) >>> line.length 2.414213562373095 >>> line.geom_type 'LineString'3、Point
class Point(coordinates)
三種賦值方式
>>> point = Point(0,0) >>> point_2 = Point((0,0)) >>> point_3 = Point(point)一個點對象有area和長度都為0
>>> point.area 0.0 >>> point.length 0.0坐標可以通過coords或x、y、z得到
>>> p = Point(2,3) >>> p.coords <shapely.coords.CoordinateSequence object at 0x7ffbc3d60dd0> >>> list(p.coords) [(2.0, 3.0)] >>> p.x 2.0 >>> p.y 3.0coords可以被切片
>>> p.coords[:] [(2.0, 3.0)]4、LineStrings
LineStrings構造函數傳入參數是2個或多個點序列
一個LineStrings對象area為0,長度非0
>>> line = LineString([(0,0), (0,1), (1,2)]) >>> line.area 0.0 >>> line.length 2.414213562373095獲得坐標
>>> line.coords[:] [(0.0, 0.0), (0.0, 1.0), (1.0, 2.0)]>>> list(line.coords)[(0.0, 0.0), (0.0, 1.0), (1.0, 2.0)]LineString依然可以接受一個同類型對象
>>> line2 = LineString(line) >>> line2.coords[:] [(0.0, 0.0), (0.0, 1.0), (1.0, 2.0)]5、常見格式轉換
wkt: Well Know Text
wkb: Well Kown Binary
>>> Point(1,1).wkt 'POINT (1 1)' >>> Point(1,1).wkb '\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?' >>> Point(1,1).wkb.encode('hex') '0101000000000000000000f03f000000000000f03f' >>> >>> Point(1,1).wkb.encode('hex') '0101000000000000000000f03f000000000000f03f'兩者都有loads和dumps方法
對于wkt
>>> from shapely.wkt import dumps, loads >>> s = dumps(Point(1,2)) >>> s 'POINT (1.0000000000000000 2.0000000000000000)' >>> ss = loads(s) >>> ss <shapely.geometry.point.Point object at 0x7ffbc3d783d0> >>> ss.coords[:] [(1.0, 2.0)]對于wkb
>>> from shapely.wkb import dumps, loads >>> s = dumps(Point(1,2), hex=True) >>> s '0101000000000000000000F03F0000000000000040' >>> ss = loads(s, hex=True) >>> ss <shapely.geometry.point.Point object at 0x7ffbc3d78790> >>> ss.coords <shapely.coords.CoordinateSequence object at 0x7ffbc3d783d0> >>> ss.coords[:] [(1.0, 2.0)]補充代碼:
# ------------------------------------------------------------------------------------------------------------------ # 在目標檢測中一個很重要的問題就是NMS及IOU計算,而一般所說的目標檢測檢測的box是規則矩形框,計算IOU也非常簡單,有兩種方法:# 1. 兩個矩形的寬之和減去組合后的矩形的寬就是重疊矩形的寬,同比重疊矩形的高 # IOU = 交集部分/包含兩個四邊形最小多邊形的面積# 2. 右下角的minx減去左上角的maxx就是重疊矩形的寬,同比高 # IOU = 重疊面積 / (兩矩形面積和—重疊面積)# 不規則四邊形就不能通過這種方式來計算,python的shapely包可以直接做到,下面給出的代碼和注釋 # 來自:白翔老師的textBoxes++論文源碼, # ------------------------------------------------------------------------------------------------------------------import numpy as np import shapely from shapely.geometry import Polygon, MultiPoint # 多邊形line1 = [2, 0, 2, 2, 0, 0, 0, 2] # 四邊形四個點坐標的一維數組表示,[x,y,x,y....];隨意分別放入框的四個角坐標 a = np.array(line1).reshape(4, 2) # 四邊形二維坐標表示 poly1 = Polygon(a).convex_hull # python四邊形對象,會自動計算四個點,最后四個點順序為:左上 左下 右下 右上 左上 print(Polygon(a).convex_hull) # 可以打印看看是不是這樣子(0 0, 0 2, 2 2, 2 0, 0 0)line2 = [1, 1, 4, 1, 4, 4, 1, 4] b = np.array(line2).reshape(4, 2) poly2 = Polygon(b).convex_hull print(Polygon(b).convex_hull)union_poly = np.concatenate((a, b)) # 合并兩個box坐標,變為8*2 print(union_poly) print(MultiPoint(union_poly).convex_hull) # 包含兩四邊形最小的多邊形點;(0 0, 0 2, 1 4, 4 4, 4 1, 2 0, 0 0) if not poly1.intersects(poly2): # 如果兩四邊形不相交iou = 0 else:try:inter_area = poly1.intersection(poly2).area # 相交面積print(inter_area)# union_area = poly1.area + poly2.area - inter_areaunion_area = MultiPoint(union_poly).convex_hull.area # 最小多邊形點面積print(union_area)if union_area == 0:iou = 0# iou = float(inter_area) / (union_area-inter_area) #錯了iou = float(inter_area) / union_area# iou=float(inter_area) /(poly1.area+poly2.area-inter_area)# 源碼中給出了兩種IOU計算方式,第一種計算的是: 交集部分/包含兩個四邊形最小多邊形的面積# 第二種: 交集 / 并集(常見矩形框IOU計算方式)except shapely.geos.TopologicalError:print('shapely.geos.TopologicalError occured, iou set to 0')iou = 0print(a)print(iou)總結
以上是生活随笔為你收集整理的python Shapely包使用,实现多边形iou的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: B+树索引实战:全值匹配查询
- 下一篇: nulls first和nulls la