Monday, July 30, 2018

[Fun] compress and composite dataset to one image file

If you want to compress and composite the images in a dataset, like MNIST or CIFAR-10, you probably can refer to my example.

People need to see it to believe it. Here you go:



My approach is based on this tool: imagemagick. You can check my previous post for installation and usage:

So, in the beginning, you should transfer your dataset to raw image files. For this, you can find out the way to do it because this post doesn't focus on transferring.

Second, go into your directory which contains all your folders with images or contains image files directly. Then, you run the following python code and it will generate a destination name "dest.png" for the result.

import os

COLUMN_LENGTH = 100 #the number of images for column in destination file
EXT_FILE = ".png"   #the sub extendion image file name that we need to process
dest_path = "/tmp"  #where to put your destination and temp files
dest_name = "dest"  #your destination file name

Compress your target images files to dest_path
def CompressImage(root, file, dest_path):
  os.system('convert %s -resize 14x14 %s' % (os.path.join(root, file), 
                                                 os.path.join(dest_path, file)))
Composite your compressed images files to destination file
def CompositeImage(rawfile_list, dest_path, dest_name):
  global EXT_FILE

  dest_vertical_list = []
  command_header = "convert +append "
  command_body = ""
  #vertical composite
  for i in range(len(rawfile_list)//COLUMN_LENGTH):
    for j in range(COLUMN_LENGTH):
      command_body += rawfile_list[i*COLUMN_LENGTH + j] + " "
    dest_file = os.path.join(dest_path, "c" + str(i) + EXT_FILE)
    command_body = command_header + command_body + dest_file
    command_body = ""
  #horizontal composite
  command_header = "convert -append "
  command_body = ""
  for i in dest_vertical_list:
    command_body += i + " "
  command_body = command_header + command_body + os.path.join(dest_path, dest_name + EXT_FILE)

# do compression
for root, dirs, files in os.walk("./"):
  for file in files:
    if file.endswith(EXT_FILE):
      print(os.path.join(root, file))
      CompressImage(root, file, dest_path)

# do composite
rawfile_list = []
for root, dirs, files in os.walk("./"):
 for file in files:
  if file.endswith(EXT_FILE):
    #print(os.path.join(root, file))
    rawfile_list.append(os.path.join(root, file))
CompositeImage(rawfile_list, dest_path, dest_name)

P.S: you also should modify the global variables, like EXT_FILES, dest_path, or dest_name, which depends on your images' ext name and your working space's path.

No comments: