在cityfm中有说道
Raster is a rasterization function that maps a closed polygon, represented as an ordered list of nodes, to a binary image
要在Python中实现一个将多边形映射到二值图像的光栅化函数,你可以按照以下步骤进行:
- 创建一个函数,输入多边形顶点列表和图像的宽高。
- 使用扫描线填充算法,来确定多边形内部的哪些像素应该设置为1。
- 返回一个二值图像,以2D NumPy数组的形式表示。
import numpy as np def rasterize_polygon(polygon, img_width, img_height): """ 将多边形光栅化为二值图像。 参数: polygon (list of tuples): (x, y)元组的列表,表示多边形的顶点。 img_width (int): 输出二值图像的宽度。 img_height (int): 输出二值图像的高度。 返回: np.array: 二值图像,1表示多边形内部,0表示外部。 """ # 创建一个空的二值图像 binary_image = np.zeros((img_height, img_width), dtype=np.uint8) # 按y坐标排序顶点 polygon = sorted(polygon, key=lambda point: point[1]) # 遍历每一条扫描线(图像的每一行) for y in range(img_height): # 找到扫描线与多边形边的交点 intersections = [] for i in range(len(polygon)): p1 = polygon[i] p2 = polygon[(i + 1) % len(polygon)] if p1[1] == p2[1]: # 忽略水平边 continue if p1[1] < y <= p2[1] or p2[1] < y <= p1[1]: x = p1[0] + (y - p1[1]) * (p2[0] - p1[0]) / (p2[1] - p1[1]) intersections.append(int(x)) # 排序交点并填充交点之间的区域 intersections.sort() for i in range(0, len(intersections), 2): if i+1 < len(intersections): x_start = max(0, intersections[i]) x_end = min(img_width, intersections[i+1]) binary_image[y, x_start:x_end] = 1 return binary_image # 示例用法 polygon = [(1, 1), (8, 1), (8, 8), (1, 8)] # 一个简单的正方形多边形 img_width, img_height = 10, 10 binary_image = rasterize_polygon(polygon, img_width, img_height) print(binary_image)
示例输出:
对于由顶点
[(1, 1), (8, 1), (8, 8), (1, 8)]
定义的正方形多边形,输出的二值图像如下所示: