Packages
image
0.32.0
0.72.0
0.71.0
0.70.0
0.69.0
0.68.0
0.67.0
0.67.0-dev
retired
0.66.0
0.65.0
0.64.0
0.63.0
0.62.1
0.62.0
0.61.1
0.61.0
0.60.0
0.59.3
0.59.2
0.59.1
0.59.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.2
0.55.1
retired
0.55.0
0.54.4
0.54.3
0.54.2
0.54.1
0.54.0
0.53.0
0.52.3
0.52.2
0.52.1
0.52.0
retired
0.51.0
0.50.0
0.49.0
0.48.1
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.2
0.43.1
0.43.0
0.42.0
0.41.0
0.40.0
0.39.3
0.39.2
0.39.1
0.39.0
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.0
0.36.2
0.36.1
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.31.0
0.30.0
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.0
0.20.0
retired
0.19.0
0.18.1
0.18.0
0.17.0
0.16.0
0.15.0
0.14.4
0.14.2
0.14.1
0.14.0
retired
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.10.0-rc.0
retired
0.9.0
retired
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
An approachable image processing library primarily based upon Vix and libvips that is NIF-based, fast, multi-threaded, pipelined and has a low memory footprint.
Current section
Files
Jump to
Current section
Files
lib/image/complex.ex
defmodule Image.Complex do
@moduledoc false
# See http://libvips.blogspot.com/2015/11/fancy-transforms.html
alias Vix.Vips.Image, as: Vimage
alias Vix.Vips.Operation
defguard complex(format) when format in [:VIPS_FORMAT_COMPLEX, :VIPS_FORMAT_DPCOMPLEX]
defguard float_format(format) when format in [:VIPS_FORMAT_FLOAT, :VIPS_FORMAT_DOUBLE]
defguard even(bands) when rem(bands, 2) === 0
@dialyzer {:nowarn_function, {:polar, 1}}
def polar(%Vimage{} = image) do
complex(image, &Operation.complex(&1, :VIPS_OPERATION_COMPLEX_POLAR))
end
@dialyzer {:nowarn_function, {:rectangular, 1}}
def rectangular(%Vimage{} = image) do
complex(image, &Operation.complex(&1, :VIPS_OPERATION_COMPLEX_RECT))
end
@dialyzer {:nowarn_function, {:rectangular!, 1}}
def rectangular!(%Vimage{} = image) do
case rectangular(image) do
{:ok, image} -> image
{:error, reason} -> raise Image.Error, reason
end
end
@dialyzer {:nowarn_function, {:complex, 2}}
defp complex(%Vimage{} = image, fun) do
bands = Vimage.bands(image)
original_format = Vimage.format(image)
with {:ok, image} <- to_complex(image, original_format, bands),
{:ok, image} <- fun.(image) do
new_format = Vimage.format(image)
from_complex(image, original_format, new_format, bands)
end
end
# Convert to complex
@dialyzer {:nowarn_function, {:to_complex, 3}}
defp to_complex(%Vimage{} = _image, format, bands)
when not complex(format) and not even(bands) do
{:error, "Not an even number of bands. Found: #{inspect(bands)}"}
end
# If its already complex, return it
defp to_complex(%Vimage{} = image, format, _bands) when complex(format) do
{:ok, image}
end
defp to_complex(%Vimage{} = image, :VIPS_FORMAT_FLOAT, bands) do
Operation.copy(image, format: :VIPS_FORMAT_COMPLEX, bands: div(bands, 2))
end
defp to_complex(%Vimage{} = image, :VIPS_FORMAT_DOUBLE, bands) do
Operation.copy(image, format: :VIPS_FORMAT_DPCOMPLEX, bands: div(bands, 2))
end
defp to_complex(%Vimage{} = image, _format, bands) do
{:ok, image} = Operation.cast(image, :VIPS_FORMAT_FLOAT)
to_complex(image, Vimage.format(image), bands)
end
# Convert from complex
@dialyzer {:nowarn_function, {:from_complex, 4}}
defp from_complex(image, original_format, :VIPS_FORMAT_DPCOMPLEX, bands)
when not complex(original_format) do
Operation.copy(image, format: :VIPS_FORMAT_DOUBLE, bands: bands)
end
defp from_complex(image, original_format, _new_format, bands)
when not complex(original_format) do
Operation.copy(image, format: :VIPS_FORMAT_FLOAT, bands: bands)
end
defp from_complex(image, _original_format, _format, _bands) do
{:ok, image}
end
end