我需要在图像(视频帧)的给定区域上绘制数千个点。
使用循环是最简单的方法。
while i < num:
x = random.randint(min_x, max_x)
y = random.randint(min_y, max_y)
//this if is to check the the random points are within the original shape
if cv2.pointPolygonTest(contour, (int(x), int(y)), False)==1:
cv2.circle(img, (int(x), int(y)), 2, color, -1)
i = i+1;
这个过程需要很长的时间来完成。
如何才能更有效地实现这一目标?
也许可以使用一些技巧来加快它的速度。
试着摆脱循环,并将你的操作矢量化. 你可以通过传入... size
到 random.randint
. 如果经过过滤后,它们并不等同于。num
,你可以生成另一个集合。
而不是 pointPolygonTest
,也许你可以试试 matplotlib.path.Path.contains_points
在一个点的矢量上操作,而不是单一的点。
对于圆,一旦你过滤了所有的圆心,就创建一个全零图像来绘制你的圆,然后在这个图像中标记圆心(再次,矢量化)。如果你想要彩色的圆,你必须为每个通道设置适当的灰度级别的像素值。然后使用具有所需半径的圆形结构元素进行扩张。对于小半径,这些圆圈应该是可以的。或者,你也可以尝试高斯模糊,因为,如果你用脉冲卷积一个高斯,就会得到一个高斯,而对称的高斯在图像中会像一个圆。如果你的圆有相同的大小,你也可以用filter2D来做这件事。如果扩张效果不好,你可以创建自己的核,类似于你想要的圆,然后用中心图像卷积。
将所有非零像素从这个 circles
图像到您的 img
使用 circles
图像作为蒙版。
一个简单的创建圆圈的例子。
import numpy as np
import cv2 as cv
# create random centers for circles
img = np.random.randint(low=0, high=1000, size=(256, 256))
img = np.uint8(img < 1) * 255
# use Gaussian bluer to create cricles
img1 = cv.GaussianBlur(img, (9, 9), 3)*20
# use morphological dilation bluer to create cricles
se = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))
img2 = cv.dilate(img, se)
中心:
使用扩张的圆
使用高斯模糊的圆: