最近在做任务时,想要使用简单几何图形作为数据集,但是一张张画几千张图象是一件十分浪费时间的事情,所以利用代码来实现这个功能。(代码可直接运行)
方法一:使用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()
这两种方法都可以直接运行,将结果存在文件夹中,作为数据集直接使用,一些实验参数我们可以根据想要实现的实验效果进行更改,满足自己想要实现的效果。
仅此作为实验数据的记录过程。