使用python随机画几何图形(矩形、圆形、三角形...)

最近在做任务时,想要使用简单几何图形作为数据集,但是一张张画几千张图象是一件十分浪费时间的事情,所以利用代码来实现这个功能。(代码可直接运行)

方法一:使用opencv进行画图

利用这种方法实现的实验结果是,背景图是随机定义的颜色,图像上的结果也是随机出现。我们可以对结果进行定义和更改。

import matplotlib.pyplot as plt
import numpy as np
import random
from cv2 import cv2
d=256
#随机绘制实心圆d
def cricle1(img):
 #d = 256
 # img = np.random.randint(0, 255) * np.ones((d, d, 3), np.uint8)
 for i in range(0, 2):
 # 随机中心点
 center_x = np.random.randint(0, high=d)
 center_y = np.random.randint(0, high=d)
 # 随机半径与颜色
 radius = np.random.randint(5, high= d /5)
 color = np.random.randint(0, high=256, size=(3, )).tolist()
 cv2.circle(img, (center_x, center_y), radius, color, -1)
 # return 0
 # imgpath = './fig/' + str(i) + '1.jpg'
 # cv2.imwrite(imgpath, img)
#绘制空心圆
def cricle2(img):
 # d = 256
 # img = np.random.randint(0, 255) * np.ones((d, d, 3), np.uint8)
 for i in range(0, 2):
 # 随机中心点
 center_x = np.random.randint(0, high=d)
 center_y = np.random.randint(0, high=d)
 # 随机半径与颜色
 radius = np.random.randint(5, high= d /5)
 color = np.random.randint(0, high=256, size=(3, )).tolist()
 cv2.circle(img, (center_x, center_y), radius, color, 2)
 # return 0
 # imgpath = './fig/' + str(i) + '2.jpg'
 # cv2.imwrite(imgpath, img)
#绘制矩形
def tangle(img):
 # d = 256
 # img = np.random.randint(0, 255) * np.ones((d, d, 3), np.uint8)
 n = np.random.randint(1,3)
 for i in range(n):
 long = np.random.randint(0, d)
 wide = np.random.randint(0, d)
 X = np.random.randint(0, d)
 Y = np.random.randint(0, d)
 color = np.random.randint(0, high=256, size=(3,)).tolist()
 cv2.rectangle(img,(X,Y),(long,wide), color,2)
 # return 0
 # imgpath = './fig/' + str(i) + '3.jpg'
 # cv2.imwrite(imgpath, img)
#绘制椭圆
def ellipse(img):
 # d = 256
 # img = np.random.randint(0, 255) * np.ones((d, d, 3), np.uint8)
 n = np.random.randint(1, 3)
 for i in range(n):
 center_x = np.random.randint(0, high=d) #随机绘制圆心
 center_y = np.random.randint(0, high=d)
 X = np.random.randint(0, d/5)
 Y = np.random.randint(0, d/5)
 color = np.random.randint(0, high=256, size=(3,)).tolist()
 cv2.ellipse(img, (center_x,center_y), (X,Y), 0, 0, 360, color,2)
 # return 0
 # imgpath = './fig/' + str(i) + '4.jpg'
 # cv2.imwrite(imgpath, img)
def main():
 # 3.显示结果
 figurenum =50
 # d=256
 # img = np.random.randint(0, 255) * np.ones((d, d, 3), np.uint8)
 for i in range(figurenum):
 img = np.random.randint(0, 255) * np.ones((d, d, 3), np.uint8)
 a = np.random.randint(0, 3)
 if a == 0:
 cricle1(img)
 elif a == 1:
 cricle2(img)
 elif a == 2:
 tangle(img)
 elif a == 3:
 ellipse(img)
 imgpath = './fig/' + str(i) + '.jpg'
 cv2.imwrite(imgpath, img)
 plt.clf()
 plt.close()
 #cv2.imshow("img", img)
 #
 # cv2.waitKey()
 # cv2.destroyAllWindows()
if __name__ == '__main__':
 main()

方法二:直接定义画图(略微复杂,但是数据结果不错,只生成背景颜色是黑色或者是白色的图,部分数据可能会重合,但是不影响使用)

import matplotlib.pyplot as plt
import matplotlib.patches as pch
import matplotlib.tri as tri
import numpy as np
import random
from cv2 import cv2
import os
import gc
figLong = 10 # 图片的长
figWide = 10 # 图片的宽
color = ['b', 'r', 'g', 'y', 'c', 'm']
def FigRect(ax, num): # 画矩形
 for i in range(num):
 long = random.uniform(0.5, 3) # 矩形的长为0.5-3之间
 wide = random.uniform(0.5, 2) #
 X = random.uniform(0, figLong - long)
 Y = random.uniform(0, figWide - wide)
 a = random.randint(0, 5)
 rect = pch.Rectangle(xy=(X, Y), width=wide, height=long, edgecolor=color[a], facecolor=color[a], fill=False,
 linewidth=2)
 ax.add_patch(rect)
 # ax.add_patch(rect)
 if num != 0:
 del ax, rect
 gc.collect()
def FigCir(num): # 画圆
 for i in range(num):
 radius = random.uniform(0.2, 1)
 X = random.uniform(radius, figLong - radius)
 Y = random.uniform(radius, figWide - radius)
 b=random.randint(0,1)
 a = random.randint(0, 5)
 # if b==0:
 # circle1 = plt.Circle((X, Y), radius, color=color[a], fill=False, linewidth=2)
 # else:
 circle1 = plt.Circle((X, Y), radius, color=color[a], fill=False, linewidth=2)
 plt.gcf().gca().add_artist(circle1)
 del circle1
 gc.collect()
def FigTri(num): # 画三角形
 for i in range(num):
 X = []
 Y = []
 x = random.uniform(0, figLong-2)
 y = random.uniform(0, figWide-2)
 X.append(x)
 Y.append(y)
 x2 = random.uniform(x, x + 2)
 y2 = random.uniform(y, y + 2)
 X.append(x2)
 Y.append(y2)
 x3 = random.uniform(x, x + 2)
 y3 = random.uniform(y, y + 2)
 X.append(x3)
 Y.append(y3)
 a = random.randint(0, 5)
 trangle=tri.Triangulation(X,Y)
 plt.triplot(trangle,color[a]+'-')
 # plt.fill(X, Y, color[a])
def FigAnn(ax,num): # 画箭头
 for i in range(num):
 x0 = random.uniform(3, 5)
 y0 = random.uniform(3, 5)
 x1 = random.uniform(1, 3)
 y1 = random.uniform(1, 3)
 a = random.randint(0, 5)
 # plt.annotate('',xy=(x0,y0),xytext=(x1,y1),arrowprops=dict(arrowstyle='->', connectionstyle='arc3',color=color[a],linewidth=3))
 w=random.uniform(0.2,0.5)
 b = random.uniform(0, 0.5)
 hw=random.uniform(w+b, w+2*b)
 hl=random.uniform(0, 0.5)
 angle=random.uniform(0, 1)
 print(x0, y0, x1, y1,w,b,angle)
 ax.arrow(x0,y0,x1,y1,width=w,head_width=1,shape='full',overhang=angle,edgecolor=color[a], facecolor=color[a], fill=False,)
def circle_p(r,d):
 return [r*np.sin(d/180.0*np.pi),r*np.cos(d/180.0*np.pi)]
def start(num): # 画五角星
 for i in range(num):
 r=random.uniform(0,2)
 wjx_p = [circle_p(r,i*72) for i in range(7)]
 a=random.randint(0,5)
 l=random.uniform(r,figLong-r)
 w=random.uniform(r,figWide-r)
 for i in range(5):
 x = [wjx_p[i][0]+l, wjx_p[i+2][0]+l]
 y = [wjx_p[i][1]+w, wjx_p[i+2][1]+w]
 plt.plot(x,y,color[a])
def main():
 figNum = 10 # 画图数量
 imgNum = 1 # 每张图的图形最多数量
 for i in range(figNum):
 fig, ax = plt.subplots(figsize=(figLong, figWide))
 a = random.randint(0, 1)
 if a == 0:
 X = np.arange(0, figLong, 0.01)
 plt.fill_between(X, 0, figWide, color='k')
 for j in range(0,imgNum):
 b = random.randint(0, 6)
 # b=3
 if b==0:
 FigRect(ax, 1)
 elif b==1:
 FigCir(1)
 elif b==2:
 FigTri(1)
 elif b==3:
 FigAnn(ax, 1)
 elif b==4:
 start(1)
 name = './fig/' + str(i) + '.jpg'
 plt.xlim(xmin=0, xmax=figLong)
 plt.ylim(ymin=0, ymax=figWide)
 plt.axis('off')
 plt.subplots_adjust(top=1, bottom=0, left=0, right=1, hspace=0, wspace=0)
 plt.margins(0, 0)
 plt.savefig(name, dpi=30)
 plt.show()
 plt.clf()
 plt.close()
 del fig, ax
 gc.collect()
if __name__ == '__main__':
 main()

这两种方法都可以直接运行,将结果存在文件夹中,作为数据集直接使用,一些实验参数我们可以根据想要实现的实验效果进行更改,满足自己想要实现的效果。

仅此作为实验数据的记录过程。

作者:一个菜菜怪原文地址:https://blog.csdn.net/qq_45027465/article/details/125315445

%s 个评论

要回复文章请先登录注册