gen.lua 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. require 'pl'
  2. require 'image'
  3. require 'trepl'
  4. local gm = require 'graphicsmagick'
  5. torch.setdefaulttensortype("torch.FloatTensor")
  6. local function color(black)
  7. local r, g, b
  8. if torch.uniform() > 0.8 then
  9. if black then
  10. return {0, 0, 0}
  11. else
  12. return {1, 1, 1}
  13. end
  14. else
  15. if torch.uniform() > 0.7 then
  16. r = torch.random(0, 1)
  17. else
  18. r = torch.uniform(0, 1)
  19. end
  20. if torch.uniform() > 0.7 then
  21. g = torch.random(0, 1)
  22. else
  23. g = torch.uniform(0, 1)
  24. end
  25. if torch.uniform() > 0.7 then
  26. b = torch.random(0, 1)
  27. else
  28. b = torch.uniform(0, 1)
  29. end
  30. end
  31. return {r,g,b}
  32. end
  33. local function gen_mod()
  34. local f = function()
  35. local xm = torch.random(2, 4)
  36. local ym = torch.random(2, 4)
  37. return function(x, y) return x % xm == 0 and y % ym == 0 end
  38. end
  39. return f()
  40. end
  41. local function dot()
  42. local sp = 1
  43. local blocks = {}
  44. local n = 64
  45. local s = 24
  46. for i = 1, n do
  47. local block = torch.Tensor(3, s, s)
  48. local margin = torch.random(1, 3)
  49. local size = torch.random(1, 4)
  50. local mod = gen_mod()
  51. local fg = color(true)
  52. local bg = color()
  53. for j = 1, 3 do
  54. block[j]:fill(bg[j])
  55. end
  56. for y = margin, s - margin do
  57. for x = margin, s - margin do
  58. local yc = math.floor(y / size)
  59. local xc = math.floor(x / size)
  60. if mod(yc, xc) then
  61. block[1][y][x] = fg[1]
  62. block[2][y][x] = fg[2]
  63. block[3][y][x] = fg[3]
  64. end
  65. end
  66. end
  67. block = image.scale(block, s * 2, s * 2, "simple")
  68. if size >= 3 and torch.uniform() > 0.5 then
  69. block = image.rotate(block, math.pi / 4, "bilinear")
  70. end
  71. blocks[i] = block
  72. end
  73. local img = torch.Tensor(#blocks, 3, s * 2, s * 2)
  74. for i = 1, #blocks do
  75. img[i]:copy(blocks[i])
  76. end
  77. img = image.toDisplayTensor({input = img, padding = 0, nrow = math.pow(n, 0.5), min = 0, max = 1})
  78. return img
  79. end
  80. local function gen()
  81. return dot()
  82. end
  83. local cmd = torch.CmdLine()
  84. cmd:text()
  85. cmd:text("dot image generator")
  86. cmd:text("Options:")
  87. cmd:option("-o", "", 'output directory')
  88. cmd:option("-n", 64, 'number of images')
  89. local opt = cmd:parse(arg)
  90. if opt.o:len() == 0 then
  91. cmd:help()
  92. os.exit(1)
  93. end
  94. for i = 1, opt.n do
  95. local img = gen()
  96. image.save(path.join(opt.o, i .. ".png"), img)
  97. end