python 图标复制(Turtle)

python-复制图标

课题要求

1、给定一个图标,如校徽,识别校徽的轮廓、颜色、内容等特征;
2、利用turtle工具包演示该校徽绘制的全过程,并将新生成图标保存为png图片。

需求分析

1、 本课题的内容和要求有三点:
(1)给定任意一个图标,如校徽,识别校徽的颜色,轮廓,内容等特征。
(2)利用turtle工具包演示图标绘制全过程
(3)将新生成的图标保存为PNG格式的图片。

2、 对于第一点要求,我们首先要实现对图标的特征提取。一个图标基本具有三要素:文字,色彩,图形。图标可以由许多图形构成,但它都有一个最基本的轮廓,轮廓的提取(这里需要了解图像的灰度化和二值化等),我们用PIL模块的Image类实现或者opencv实现,颜色的提取依然可以用PIL模块,它可以提取某个像素点的R,G,B。文字的提取和识别可以用百度云或者tesseract-ocr,但是百度云的识别较为准确。
3、 对于第二点要求,我们首先要学会使用turtle工具包,掌握它的基本操作,例如对画笔的基本控制和它的走向,画笔画出的线条的粗细。然后依照提取出来的轮廓,画出框架,再用第一步提取出来的颜色对指定区域进行颜色填充,最后对上面画出的基本图形与原图作比较,进行修改和补充,完成演示图标的绘制全过程。
4、 对于第三点要求,我们要完成一个图片格式的转化。因为用Turtle画的图无法直接保存成png格式的,只能先保存成eps,再将eps转为png格式,这个可以用PIL的image类的函数save()实现。
5、 整个工作可以分为三个步骤:

开发环境和开发工具

开发语言

全部代码仅运用python语言。

开发工具

软件在开发过程使用的集成式开发工具、软件包、库函数等。
运用的集成式开发工具:pycharm
软件包:下载了Tesseract-OCR安装包、chi_sim.traineddata简体中文语言包;
库函数:在pycharm中安装了PIL(pillow),opencv模块用以对图片进行处理,配置了tesserocr库用以提取文字。安装了numpy模块,对提取出来点转化成矩阵进行处理。
(1)PIL的image模块函数:open(),filter(),Convert(),save()等
(2)Opencv:imread(),namedWindow(),setMouseCallback(),imshow()等
(3)pytesseract:imag_to_string()等

开发环境

软件框架:无
硬件平台:pycharm
操作系统:windows

模块分析

整个分为三个模块:提取模块(Fimformation),绘图模块(Draw),保存模块(Save)。

模块1:提取模块

主要功能:提取图片的相关信息如颜色、轮廓等,为后期绘图奠定基础,得到数据信息。
设计思路:运用各种方法函数将信息提取出来,并用文件形式进行保存。
实施方案:用PIL和OpenCV来对图片进行处理,定义了frounding()函数,运用ImageFilter模块的filter方法提取出图片的轮廓并保存该轮廓图片;运用tesseract-OCR的pytesseract提取图片的文字,前提是文字内容按正常规格字体,字体越正规,准确率越高;定义fRGB()函数得到像素点集,运用PIL的Image模块的方法提取RGB点集,convert(”RGB”)方法将图片转化为RGB格式,并提取每一个像素点的RGB,存入o.txt文件中;定义fL()函数来将图片转为灰度图片并提取灰度值储存在p.txt文件中;定义bian()函数将图片进行锐化,并保存锐化图片;定义Lpicture()函数来查看灰度图片并将其保存下来。这些都是图片的修改以及图片信息的存储,可以为数据分析和turtle绘画奠定基础。

模块2:绘制模块

主要功能:用turtle绘制出图像。
设计思路:运用每个像素点的RGB值,让turtle海龟从左上角开始,一个一个点进行绘制。将RGB点集导入给turtle,运用turtle的绘图方法,让turtle能够实现跟随坐标自动化绘制图像,并精准的赋予相应的颜色,尽量达到百分之百的精准复制,全程自动化。
实施方案:在draw()模块中进行绘制,得到图片的长和宽,运用convert(”RGB”)方法将图片转化为RGB格式,并用getpixel(i, j)提取像素点RGB值保存在list中,然后直接遍历list,取出像素值;在turtle绘图过程中,我们需要先将中间的海龟,回归到左上角然后从左到右,从上到下利用像素点一个一个标上去,全程自动;当海龟到达最右端时,利用飞行将其挪至最左端再往下一点,然后再次向右绘制,只需在遍历整张图的过程中,利用if去判断是否到达最右端,其余情况只需要向右走就行。同时,为了清楚明了,我们把所有的像素点RGB值在绘画的过程中print出来。

*(其实这个方法是一种笨方法,思路简单,也没什么技术含量,耗时久,而且绘制图片的时候看起来也不美观,但是我只能想到这种方法了┭┮﹏┭┮)

模块3:保存模块

主要功能:将turtle绘制的图像保存为png图片
设计思路:因为不能直接保存为png图片,所以我们先选择保存为eps脚本再转为jpg、png图片。
实施方案:利用turtle的getscreen()方法获取到图像,引入PIL中的image模块,将turtle绘制完的图像保存为eps 即postscript脚本,然后先将其转化为jpg格式图片,png格式多了一个alpha通道,用来存储透明度信息;所以在转为png格式的时候,需要加入透明度信息,定义一个transparent_back()函数进行转换,在里面遍历循环每一个点,为其加上信息,得到总体的png图片。

代码

# coding = utf -8
from PIL import Image
from PIL import ImageEnhance
from PIL import ImageFilter
import turtle as t
import pytesseract
#提取模块
def frounding() :#提取轮廓
    im = Image.open("E:\\xiao.png")
    om = im.filter(ImageFilter.CONTOUR)
    om.save('E:\\xiao3.png')
    print("***提取轮廓完成***")
    #实现图片文字(中文)提取并打印
    im = Image.open("E:\\xiao.png")#这里对图片文字格式的要求很高
    print("徽章文字为:")
    text = pytesseract.image_to_string((im), lang='chi_sim')
    print(text)
def fRGB() :#提取像素点RGB
    f = open("o.txt", 'w+')  # o.txt是文件名,w:覆盖写模式,文件不存在则创建,存在就会完全覆盖。+:与r/w/x/a一同使用,再原功能基础上增加同时读写功能。
    im = Image.open("E:\\xiao.png")
    length, height = im.size[0], im.size[1]
    rgb_im = im.convert("RGB")
    for i in range(length):
        list = []
        for j in range(height):
            # getpixel函数是用来获取图像中某一点像素的RGB颜色值,getpixel的参数是一个坐标点,返回值是R,G,B
            list.append(rgb_im.getpixel((i, j)))
        print(list, file=f)  # 将R,G,B写入文件中
    print("***RGB点集提取完成***")
   #会得到一个o.txt文件,里面是每一个点的对应RGB值,很客观
def fL() :#转为灰度图片并提取灰度值
    f = open("p.txt", 'w+')  # o.txt是文件名,w:覆盖写模式,文件不存在则创建,存在就会完全覆盖。+:与r/w/x/a一同使用,再原功能基础上增加同时读写功能。
    im = Image.open("E:\\xiao.png")
    length, height = im.size[0], im.size[1]
    rgb_im = im.convert("L")
    for i in range(length):
        list = []
        for j in range(height):
            # getpixel函数是用来获取图像中某一点像素的RGB颜色值,getpixel的参数是一个坐标点,返回值是R,G,B
            list.append(rgb_im.getpixel((i, j)))
        print(list, file=f)  # 将R,G,B写入文件中
    print("***灰度图像值提取完成***")
def Lpicture() :#查看灰度图片并保存
    im = Image.open("E:\\xiao.png")
    img = im.convert("L")
    img.save("yuan2","png")
    img.show()
    print("***灰度图保存完成***")
def bian() :#对图片实现边缘锐化并保存(扩展程序)
    im = Image.open("E:\\xiao.png")
    om = ImageEnhance.Sharpness(im)
    om.enhance(20).save('E:\\xiao2.png')
    print("***边缘锐化图保存完成***")
#绘图模块
def draw():
    # f = open("o.txt", 'w+')  # o.txt是文件名,w:覆盖写模式,文件不存在则创建,存在就会完全覆盖。+:与r/w/x/a一同使用,再原功能基础上增加同时读写功能。
    im = Image.open(r"E:\\xiao.png")
    l, h = im.size[0], im.size[1]
    rgb_im = im.convert("RGB")
    list = []
    for j in range(h):
        for i in range(l):
            # getpixel函数是用来获取图像中某一点像素的RGB颜色值,getpixel的参数是一个坐标点,返回值是R,G,B
            list.append(rgb_im.getpixel((i, j)))
    try:
        t.setup()
    except t.Terminator:
        pass
    print(list[210600])
    t.colormode(255)
    t.penup()
    t.bk(h//2)
    t.left(90)
    t.fd(l//2)
    t.seth(0)
    t.pendown()
    t.speed(1)
    t.delay(500)
    t.tracer(False)
    # print(list, file=f)  # 将R,G,B写入文件中
    # t.setup(1000,800)
    for i in range(len(list)):
        if (i + 1) % l == 0:
            t.penup()
            t.bk(l)
            t.right(90)
            t.fd(1)
            t.seth(0)
            t.pendown()
        rgb = list[i]
        print(rgb)
        t.pencolor(rgb)
        t.fd(1)
    t.done()

frounding()
fRGB()
fL()
Lpicture()
bian()
draw()
#保存模块
def saveJ() :#暂先保存图片为jpg
    ts.getcanvas().postscript(file="E:\\work.eps") #.eps文件即postscript脚本
    im = Image.open("E:\\work.eps")
    im.save("E:\\work.jpg", "JPEG")
    img=Image.open('E:\\work.jpg')
    img=transparent_back(img)
    img.save('img2.png')
def transparent_back(img):
    img = img.convert('RGBA')
    L, H = img.size
    color_0 = (255,255,255,255)#要替换的颜色
    for h in range(H):
        for l in range(L):
            dot = (l,h)
            color_1 = img.getpixel(dot)
            if color_1 == color_0:
                color_1 = color_1[:-1] + (0,)
                img.putpixel(dot,color_1)
    return img
saveJ()
print("**turtle图片保存成功**")

原图:

turtle绘制的图片:
在这里插入图片描述
提取的轮廓:
在这里插入图片描述

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值