python怎么生成图片,用python将照片做成数据集

  python怎么生成图片,用python将照片做成数据集

  【相关学习推荐:python教程

  00-1010前言Github效果实现流程整体代码

文章目录

看电影的时候发现了一个照片墙的功能。我觉得生成这样的照片很好玩,就开始用Python做了,觉得用它做照片留念效果可能会不错。

  在P:之后,我了解到我要做的功能叫蒙太奇拼图,所以我先把这个博客记录保留下来,有空的时候看看蒙太奇拼图的算法。

  

前言

https://github.com/jiandi1027/photo.git

  

Github

  00-1010 1.获取图片文件夹中图片的数量n,将底图分割成XY块区域,制作X * YN

  (为了保证整体协调,会舍弃一些图片,比如5张的时候可能只拍22张的4张)

  #打开图片

  base=Image.open(baseImgPath)

  base=base.convert(RGBA )

  #从图片文件夹中获取图片,并将它们打乱顺序

  files=glob.glob(imagesPath /*)。*)

  随机播放(文件)

  #图片数量

  num=len(文件)

  #底图大小

  x=base.size[0]

  y=base.size[1]

  #每张图片的图片数此公式是与图片总数num of xNum * yNum成比例的最大整数。

  yNum=int((数量/(y/x)) ** 0.5)

  如果yNum==0:

  yNum=1

  xNum=int(数字/yNum)

  #图片大小为1,因为像素没有小数点以防止黑边。

  xSize=int(x/xNum) 1

  ySize=int(y/yNum) 1

  2.遍历文件夹中的图片,依次填充,生成最终的合成图片。

  对于文件:中的文件

  fromImage=Image.open(文件)

  i=int(num % xNum)

  j=int(num/xNum)

  out=fromImage.resize((xSize,ySize),Image。抗锯齿)。转换(“RGBA”)

  toImage.paste(out,(i * xSize,j * ySize))

  toImage=toImage.convert(RGBA )

  img=Image.blend(base,toImage,0.3)

  #显示图片

  photo=ImageTk。照片图像

  showLabel.config(image=photo)

  showLabel.image=照片

  if num xNum * yNum:

  数字=数字13。生成后保存图片。

  toImage.save( generator.png )

  img.save(" final.png ")

  4.建立可视化界面。

  5.Pyinstaller生成exe可执行文件

  安装pyinstaller模块,执行命令生成exe文件。

  Py-f-w test.py (-w是取消窗口)

效果

Python的语法和设计规范还没学过,所以代码规范代码复用之类的可能有点不合时宜。这篇博文主要是一个想法和整个过程的记录。

  然后优化了一些特效,比如合成图的随机位置,增加黑白,时间流逝等显示特效,可选透明度。

  进口PIL。图像作为图像

  导入全球

  随机导入

  导入tkinter.filedialog

  从tkinter.filedialog导入ask目录,标签,按钮,单选按钮,条目

  导入线程

  将numpy作为np导入

  从PIL进口

  rt ImageTk

  alpha = 0.3

  imagesPath = ''

  # 滑动条回调 修改透明度

  def resize(ev=None):

   global alpha

   alpha = scale.get() / 100

  # 黑白

  def blackWithe(image):

   # r,g,b = r*0.299+g*0.587+b*0.114

   im = np.asarray(image.convert('RGB'))

   trans = np.array([[0.299, 0.587, 0.114], [0.299, 0.587, 0.114], [0.299, 0.587, 0.114]]).transpose()

   im = np.dot(im, trans)

   return Image.fromarray(np.array(im).astype('uint8'))

  # 流年

  def fleeting(image, params=12):

   im = np.asarray(image.convert('RGB'))

   im1 = np.sqrt(im * [1.0, 0.0, 0.0]) * params

   im2 = im * [0.0, 1.0, 1.0]

   im = im1 + im2

   return Image.fromarray(np.array(im).astype('uint8'))

  # 旧电影

  def oldFilm(image):

   im = np.asarray(image.convert('RGB'))

   # r=r*0.393+g*0.769+b*0.189 g=r*0.349+g*0.686+b*0.168 b=r*0.272+g*0.534b*0.131

   trans = np.array([[0.393, 0.769, 0.189], [0.349, 0.686, 0.168], [0.272, 0.534, 0.131]]).transpose()

   # clip 超过255的颜色置为255

   im = np.dot(im, trans).clip(max=255)

   return Image.fromarray(np.array(im).astype('uint8'))

  # 反色

  def reverse(image):

   im = 255 - np.asarray(image.convert('RGB'))

   return Image.fromarray(np.array(im).astype('uint8'))

  def chooseBaseImagePath():

   name = tkinter.filedialog.askopenfilename()

   if name != '':

   global baseImgPath

   baseImgPath = name

   baseImageLabel.config(text=name)

   baseImg = Image.open(baseImgPath)

   widthEntry.delete(0, tkinter.END)

   heightEntry.delete(0, tkinter.END)

   widthEntry.insert(0, baseImg.size[0])

   heightEntry.insert(0, baseImg.size[1])

   else:

   baseImageLabel.config(text="您没有选择任何文件")

  def chooseImagesPath():

   name = askdirectory()

   if name != '':

   global imagesPath

   imagesPath = name

   ImagesLabel.config(text=name)

   else:

   ImagesLabel.config(text="您没有选择任何文件")

  def thread_it(func, *args):

   # 创建

   t = threading.Thread(target=func, args=args)

   # 守护 !!!

   t.setDaemon(True)

   # 启动

   t.start()

  def test():

   MyThread(1, "Thread-1", 1).start()

  baseImgPath = ''

  def generator():

   baseImg = Image.open(baseImgPath)

   baseImg = baseImg.convert('RGBA')

   files = glob.glob(imagesPath + '/*.*') # 获取图片

   random.shuffle(files)

   num = len(files)

   # 模板图片大小

   x = baseImg.size[0]

   y = baseImg.size[1]

   # 每张图片数量 这个公式是为了xNum * yNum 的总图片数量<num又成比例的最大整数

   yNum = int((num / (y / x)) ** 0.5)

   if yNum == 0:

   yNum = 1

   xNum = int(num / yNum)

   # 图片大小 因为像素没有小数点 为防止黑边所以+1

   xSize = int(x / xNum) + 1

   ySize = int(y / yNum) + 1

   # 生成数量的随机列表 用于随机位置合成图片

   l = [n for n in range(0, xNum * yNum)]

   random.shuffle(l)

   toImage = Image.new('RGB', (x, y))

   num = 1

   for file in files:

   if num <= xNum * yNum:

   num = num + 1

   else:

   break

   fromImage = Image.open(file)

   temp = l.pop()

   i = int(temp % xNum)

   j = int(temp / xNum)

   out = fromImage.resize((xSize, ySize), Image.ANTIALIAS).convert('RGBA')

   toImage.paste(out, (i * xSize, j * ySize))

   toImage = toImage.convert('RGBA')

   img = Image.blend(baseImg, toImage, alpha)

   # 特效 但是会读取像素会降低效率

   choose = v.get()

   if choose == 1:

   img = blackWithe(img)

   elif choose == 2:

   img = fleeting(img)

   elif choose == 3:

   img = oldFilm(img)

   elif choose == 4:

   img = reverse(img)

   resize = img.resize((300, 300), Image.ANTIALIAS).convert('RGBA')

   # 显示图片

   photo = ImageTk.PhotoImage(resize)

   showLabel.config(image=photo)

   showLabel.image = photo

   toImage.save('generator.png')

   img = img.resize((int(widthEntry.get()),int(heightEntry.get())), Image.ANTIALIAS).convert('RGBA')

   img.save("final.png")

   resize.save("resize.png")

  class MyThread(threading.Thread): # 继承父类threading.Thread

   def __init__(self, threadID, name, counter):

   threading.Thread.__init__(self)

   self.threadID = threadID

   self.name = name

   self.counter = counter

   def run(self): # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数

   generator()

  root = tkinter.Tk()

  root.title('generator')

  root.geometry('500x550')

  baseImageLabel = Label(root, text='')

  baseImageLabel.place(x=10, y=10)

  baseImageBtn = Button(root, text="选择底图", command=chooseBaseImagePath).place(x=10, y=30)

  ImagesLabel = Label(root, text='')

  ImagesLabel.place(x=10, y=60)

  ImagesBtn = Button(root, text="选择合成图文件夹", command=chooseImagesPath).place(x=10, y=80)

  v = tkinter.IntVar()

  v.set(0)

  Radiobutton(root, variable=v, text='默认', value=0, ).place(x=10, y=120)

  Radiobutton(root, variable=v, text='黑白', value=1, ).place(x=110, y=120)

  Radiobutton(root, variable=v, text='流年', value=2, ).place(x=210, y=120)

  Radiobutton(root, variable=v, text='旧电影', value=3, ).place(x=310, y=120)

  Radiobutton(root, variable=v, text='反色', value=4, ).place(x=410, y=120)

  scaleLabel = Label(root, text='透明度').place(x=10, y=170)

  scale = tkinter.Scale(root, from_=0, to=100, orient=tkinter.HORIZONTAL, command=resize)

  scale.set(30) # 设置初始值

  scale.pack(fill=tkinter.X, expand=1)

  scale.place(x=70, y=150)

  Label(root, text='宽(像素)').place(x=180, y=170)

  widthEntry = Entry(root, bd=1)

  widthEntry.place(x=230, y=173, width=100)

  Label(root, text='高(像素)').place(x=320, y=170)

  heightEntry = Entry(root, bd=1)

  heightEntry.place(x=370, y=173, width=100)

  generatorBtn = Button(root, text="生成", command=test).place(x=10, y=220)

  showLabel = Label(root)

  showLabel.place(x=100, y=220)

  root.mainloop()

想了解更多编程学习,敬请关注php培训栏目!

  

以上就是Python照片合成的方法详解的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • python将字符串转换成日期,python 字符串转换为日期
  • python将字符串转换成日期,python 字符串转换为日期,Python如何将字符串转换为日期
  • python将字符串转换为数字型,python中数字字符和数字值有何不同,如何转换
  • python将两个一维数组转化为二维数组,matlab把二维数组转为三维数组
  • python将文本转为数组,python读取txt文件为数组
  • python将一个正整数分解成质因数,用python分解质因数
  • python单位转换编程英寸厘米,python将8厘米转换为以英寸为单位的长度并输出
  • python将列表中指定元素修改,python 替换列表中的元素
  • Python将字符串分割,python中把字符串分割成单个字符
  • python将数字转换为日期,python excel写入日期变数字
  • Python读取文件名写入Excel,python将结果写入excel文件
  • 用python将字符串进行反转,python中字符串反转函数
  • python 数字类型和字符串类型的相互转换,python将字符串类型转换为数字
  • Python读取文件名写入Excel,python将数据写入excel指定单元格
  • python中将字符串转化为数字,Python将字符串转为数字
  • 留言与评论(共有 条评论)
       
    验证码: