123 lines
2.8 KiB
Lua
123 lines
2.8 KiB
Lua
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}
|
|
end
|
|
|
|
local 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()
|
|
end
|
|
local 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 img
|
|
end
|
|
local function gen()
|
|
return dot()
|
|
end
|
|
|
|
local 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)
|
|
end
|
|
|
|
for i = 1, opt.n do
|
|
local img = gen()
|
|
image.save(path.join(opt.o, i .. ".png"), img)
|
|
end
|