| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 | require 'pl'require 'image'require 'trepl'local gm = require 'graphicsmagick'torch.setdefaulttensortype("torch.FloatTensor")local function color(black)   local r, g, b   if torch.uniform() > 0.8 then      if black then	 return {0, 0, 0}      else	 return {1, 1, 1}      end   else      if torch.uniform() > 0.7 then	 r = torch.random(0, 1)      else	 r = torch.uniform(0, 1)      end      if torch.uniform() > 0.7 then	 g = torch.random(0, 1)      else	 g = torch.uniform(0, 1)      end      if torch.uniform() > 0.7 then	 b = torch.random(0, 1)      else	 b = torch.uniform(0, 1)      end   end   return {r,g,b}endlocal function gen_mod()   local f = function()      local xm = torch.random(2, 4)      local ym = torch.random(2, 4)      return function(x, y) return x % xm == 0 and y % ym == 0 end   end   return f()endlocal function dot()   local sp = 1   local blocks = {}   local n = 64   local s = 24   for i = 1, n do      local block = torch.Tensor(3, s, s)      local margin = torch.random(1, 3)      local size = torch.random(1, 5)      local mod = gen_mod()      local swap_color = torch.uniform() > 0.5      local fg, bg      if swap_color then	 fg = color()	 bg = color(true)      else	 fg = color(true)	 bg = color()      end      local use_cross_and_skip = torch.uniform() > 0.5      for j = 1, 3 do	 block[j]:fill(bg[j])      end      for y = margin, s - margin do	 local b = 0	 if use_cross_and_skip and torch.random(0, 1) == 1 then	    b = torch.random(0, 1)	 end	 for x = margin, s - margin do	    local yc = math.floor(y / size)	    local xc = math.floor(x / size)	    if use_corss_and_skip then	       if torch.uniform() > 0.25 and mod(yc + b, xc + b) then		  block[1][y][x] = fg[1]		  block[2][y][x] = fg[2]		  block[3][y][x] = fg[3]	       end	    else	       if mod(yc + b, xc + b) then		  block[1][y][x] = fg[1]		  block[2][y][x] = fg[2]		  block[3][y][x] = fg[3]	       end	    end	 end      end      block = image.scale(block, s * 2, s * 2, "simple")      if (not use_corss_and_skip) and size >= 3 and torch.uniform() > 0.5 then	 block = image.rotate(block, math.pi / 4, "bilinear")      end      blocks[i] = block   end   local img = torch.Tensor(#blocks, 3, s * 2, s * 2)   for i = 1, #blocks do      img[i]:copy(blocks[i])   end   img = image.toDisplayTensor({input = img, padding = 0, nrow = math.pow(n, 0.5), min = 0, max = 1})   return imgendlocal function gen()   return dot()endlocal cmd = torch.CmdLine()cmd:text()cmd:text("dot image generator")cmd:text("Options:")cmd:option("-o", "", 'output directory')cmd:option("-n", 64, 'number of images')local opt = cmd:parse(arg)if opt.o:len() == 0 then   cmd:help()   os.exit(1)endfor i = 1, opt.n do   local img = gen()   image.save(path.join(opt.o, i .. ".png"), img)end
 |