使用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()

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值