Numpy 如何在数组中画线
在Numpy中,我们可以使用一些函数来在数组中绘制线条。这些函数使用的是Bresenham算法,这是一种基于随机取样的算法,其目标是在网格上绘制一条连续的线。
阅读更多:Numpy 教程
1. 画一条直线
在Numpy中,我们可以使用numpy.zeros()函数来生成一个全0的数组。下面是如何在数组中画一条直线的示例代码:
import numpy as np
import matplotlib.pyplot as plt
def draw_line(img, pt1, pt2, color):
"""
在数组中画一条直线
:param img: 数组
:param pt1: 直线起点
:param pt2: 直线终点
:param color: 线颜色
"""
x1, y1 = pt1
x2, y2 = pt2
dy = y2 - y1
dx = x2 - x1
if abs(dx) > abs(dy):
yy = np.linspace(y1, y2, abs(dx) + 1)
xx = np.linspace(x1, x2, abs(dx) + 1)
else:
yy = np.linspace(y1, y2, abs(dy) + 1)
xx = np.linspace(x1, x2, abs(dy) + 1)
for x, y in zip(xx, yy):
img[int(round(y)), int(round(x))] = color
img = np.zeros((512, 512))
pt1 = (50, 50)
pt2 = (200, 250)
color = 255
draw_line(img, pt1, pt2, color)
plt.imshow(img, cmap='gray')
plt.show()
在这个示例中,我们使用numpy.linspace()函数来生成一个起点是pt1,终点为pt2的线段。然后,我们使用round()函数将坐标四舍五入到最接近的整数,并在这些点中绘制一条线。
2. 画一条多边形
在Numpy中,我们可以使用numpy.polyline()函数来绘制一个多边形。下面是如何在数组中绘制一个多边形的示例代码:
import numpy as np
import matplotlib.pyplot as plt
def draw_polygon(img, pts):
"""
在数组中画一个多边形
:param img: 数组
:param pts: 多边形的顶点
"""
pts = np.array(pts, np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (255, 255, 255))
img = np.zeros((512, 512, 3), np.uint8)
pts = [[10, 10], [50, 60], [100, 20], [150, 100], [50, 200]]
draw_polygon(img, pts)
plt.imshow(img)
plt.show()
在这个示例中,我们首先使用numpy.array()函数把多边形的顶点转换为Numpy数组。然后,我们使用numpy.reshape()函数将多边形的顶点转换为(n, 1, 2)的形状,其中n是多边形的顶点数。最后,我们使用numpy.polylines()函数在数组中绘制多边形。
3. 画一个矩形
在Numpy中,我们可以使用numpy.rectangle()函数来绘制一个矩形。下面是如何在数组中绘制一个矩形的示例代码:
import numpy as np
import matplotlib.pyplot as plt
def draw_rectangle(img, pt1, pt2, color):
"""
在数组中画一个矩形
:param img: 数组
:param pt1: 矩形左上角
:param pt2: 矩形右下角
:param color: 颜色
"""
cv2.rectangle(img, pt1, pt2, color, -1)
img = np.zeros((512, 512, 3), np.uint8)
pt1 = (50, 50)
pt2 = (200, 200)
color = (255, 0, 0)
draw_rectangle(img, pt1, pt2, color)
plt.imshow(img)
plt.show()
在这个示例中,我们使用numpy.zeros()函数和numpy.uint8数据类型创建一个三通道的全零数组。然后,我们使用cv2.rectangle()函数在数组中绘制一个矩形。
4. 画一个圆形
在Numpy中,我们可以使用numpy.circle()函数来绘制一个圆形。下面是如何在数组中绘制一个圆形的示例代码:
import numpy as np
import matplotlib.pyplot as plt
def draw_circle(img, center, radius, color):
"""
在数组中画一个圆形
:param img: 数组
:param center: 圆心
:param radius: 半径
:param color: 颜色
"""
cv2.circle(img, center, radius, color, -1)
img = np.zeros((512, 512, 3), np.uint8)
center = (256, 256)
radius = 100
color = (0, 255, 0)
draw_circle(img, center, radius, color)
plt.imshow(img)
plt.show()
在这个示例中,我们使用numpy.zeros()函数和numpy.uint8数据类型创建一个三通道的全零数组。然后,我们使用cv2.circle()函数在数组中绘制一个圆形。
总结
在本文中,我们介绍了在Numpy中绘制线条、多边形、矩形和圆形的方法。这些函数使用的是Bresenham算法,使用起来非常方便。在实际应用中,我们可以使用这些函数进行图像处理、计算机视觉等操作。
极客教程