赞
踩
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)。
主要功能:提取图片的相关信息如颜色、轮廓等,为后期绘图奠定基础,得到数据信息。
设计思路:运用各种方法函数将信息提取出来,并用文件形式进行保存。
实施方案:用PIL和OpenCV来对图片进行处理,定义了frounding()函数,运用ImageFilter模块的filter方法提取出图片的轮廓并保存该轮廓图片;运用tesseract-OCR的pytesseract提取图片的文字,前提是文字内容按正常规格字体,字体越正规,准确率越高;定义fRGB()函数得到像素点集,运用PIL的Image模块的方法提取RGB点集,convert(”RGB”)方法将图片转化为RGB格式,并提取每一个像素点的RGB,存入o.txt文件中;定义fL()函数来将图片转为灰度图片并提取灰度值储存在p.txt文件中;定义bian()函数将图片进行锐化,并保存锐化图片;定义Lpicture()函数来查看灰度图片并将其保存下来。这些都是图片的修改以及图片信息的存储,可以为数据分析和turtle绘画奠定基础。
主要功能:用turtle绘制出图像。
设计思路:运用每个像素点的RGB值,让turtle海龟从左上角开始,一个一个点进行绘制。将RGB点集导入给turtle,运用turtle的绘图方法,让turtle能够实现跟随坐标自动化绘制图像,并精准的赋予相应的颜色,尽量达到百分之百的精准复制,全程自动化。
实施方案:在draw()模块中进行绘制,得到图片的长和宽,运用convert(”RGB”)方法将图片转化为RGB格式,并用getpixel(i, j)提取像素点RGB值保存在list中,然后直接遍历list,取出像素值;在turtle绘图过程中,我们需要先将中间的海龟,回归到左上角然后从左到右,从上到下利用像素点一个一个标上去,全程自动;当海龟到达最右端时,利用飞行将其挪至最左端再往下一点,然后再次向右绘制,只需在遍历整张图的过程中,利用if去判断是否到达最右端,其余情况只需要向右走就行。同时,为了清楚明了,我们把所有的像素点RGB值在绘画的过程中print出来。
*(其实这个方法是一种笨方法,思路简单,也没什么技术含量,耗时久,而且绘制图片的时候看起来也不美观,但是我只能想到这种方法了┭┮﹏┭┮)
主要功能:将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绘制的图片:
提取的轮廓:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。