complex_transform.jl 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/julia
  2. # Trizen
  3. # 27 April 2017
  4. # https://github.com/trizen
  5. # Complex transform of an image, by mapping each pixel position to a complex function.
  6. # usage:
  7. # julia complex_transform.jl [image]
  8. using Images
  9. #using SpecialFunctions
  10. function map_val(value, in_min, in_max, out_min, out_max)
  11. (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
  12. end
  13. function complex_transform(file)
  14. img = load(file)
  15. height, width = size(img)
  16. function transform(x, y)
  17. z = complex(
  18. (2 * x - width ) / width,
  19. (2 * y - height) / height
  20. )
  21. # Complex function
  22. z = (cos(z) + sin(z)*im) / im
  23. (real(z), imag(z))
  24. end
  25. matrix = zeros(height, width, 2)
  26. min_x, min_y = (Inf, Inf)
  27. max_x, max_y = (-Inf, -Inf)
  28. for y in 1:height, x in 1:width
  29. new_x, new_y = transform(x, y)
  30. matrix[y,x,1] = new_x
  31. matrix[y,x,2] = new_y
  32. if (new_x < min_x)
  33. min_x = new_x
  34. end
  35. if (new_y < min_y)
  36. min_y = new_y
  37. end
  38. if (new_x > max_x)
  39. max_x = new_x
  40. end
  41. if (new_y > max_y)
  42. max_y = new_y
  43. end
  44. end
  45. println("X: [$min_x, $max_x]")
  46. println("Y: [$min_y, $max_y]")
  47. out_img = zeros(RGB{N0f8}, height, width)
  48. for y in 1:height, x in 1:width
  49. out_img[y,x] = RGB{N0f8}(0,0,0)
  50. end
  51. for y in 1:height, x in 1:width
  52. new_x = map_val(matrix[y,x,1], min_x, max_x, 1, width)
  53. new_y = map_val(matrix[y,x,2], min_y, max_y, 1, height)
  54. if (abs(new_x) == Inf || isnan(new_x) || abs(new_y) == Inf || isnan(new_y))
  55. println("Skipping one pixel...")
  56. continue
  57. end
  58. new_x = round(Int64, new_x)
  59. new_y = round(Int64, new_y)
  60. out_img[new_y,new_x] = img[y,x]
  61. end
  62. return out_img
  63. end
  64. inputfile = length(ARGS) > 0 ? ARGS[1] : "input.png"
  65. save("complex_transform.png", complex_transform(inputfile))