Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Image

livebooks/vix/image.livemd

Image

Mix.install([
  {:image, "~> 0.38"},
  {:req, "~> 0.3"},
  {:kino, "~> 0.12"}
])

画像の読込

ファイルから

puppies_img = Image.open!("/home/livebook/vix/puppies.png")

Kino.Input から

chroma_key_img_input = Kino.Input.image("CHROMA KEY IMAGE", format: :rgb)
file = Kino.Input.read(chroma_key_img_input)

chroma_key_img =
  file
  |> Map.merge(%{data: file.file_ref |> Kino.Input.file_path() |> File.read!()})
  |> Image.from_kino!()

Image.Kino.show(chroma_key_img, max_height: 400)

Web から

ryo_img =
  "https://www.elixirconf.eu/assets/images/ryo-wakabayashi.png"
  |> Req.get!()
  |> Map.get(:body)
  |> Image.from_binary!()

Image.Kino.show(ryo_img, max_height: 400)

画像処理

色変換

puppies_img
|> Image.to_colorspace!(:bw)
|> Image.Kino.show()

ぼかし

puppies_img
|> Image.blur!()
|> Image.Kino.show()
1..10
|> Enum.map(fn sigma ->
  puppies_img
  |> Image.blur!(sigma: sigma)
  |> Image.Kino.show()
end)
|> Kino.Layout.grid(columns: 5)

モザイク

puppies_img
|> Image.pixelate!()
|> Image.Kino.show()
1..10
|> Enum.map(fn scale ->
  puppies_img
  |> Image.pixelate!(scale / 100)
  |> Image.Kino.show()
end)
|> Kino.Layout.grid(columns: 5)

リサイズ

puppies_img
|> Image.resize!(0.2)
|> Image.Kino.show()

反転

puppies_img
|> Image.flip!(:horizontal)
|> Image.Kino.show()
puppies_img
|> Image.flip!(:vertical)
|> Image.Kino.show()

回転

puppies_img
|> Image.rotate!(45)
|> Image.Kino.show()
Stream.interval(1)
|> Stream.take(361)
|> Kino.animate(fn angle ->
  puppies_img
  |> Image.rotate!(angle)
  |> Image.Kino.show()
end)

切り抜き

puppies_img
|> Image.crop!(0.3, 0.2, 0.5, 0.7)
|> Image.Kino.show()

合成

puppies_img
|> Image.compose!(ryo_img, blend_mode: :over)
|> Image.Kino.show()
puppies_img
|> Image.compose!(ryo_img, blend_mode: :lighten)
|> Image.Kino.show()
puppies_img
|> Image.compose!(ryo_img, blend_mode: :add)
|> Image.Kino.show()
puppies_img
|> Image.compose!(ryo_img, blend_mode: :difference)
|> Image.Kino.show()

膨張、収縮(ノイズ除去)

noise_img = Image.open!("/home/livebook/vix/noise.png")

Image.Kino.show(noise_img)
[
  noise_img |> Image.dilate!(3),
  noise_img |> Image.erode!(3)
]
|> Enum.map(&Image.Kino.show(&1, max_height: 400))
|> Kino.Layout.grid(columns: 2)
[
  noise_img,
  noise_img |> Image.erode!(3) |> Image.dilate!(3)
]
|> Enum.map(&Image.Kino.show(&1, max_height: 400))
|> Kino.Layout.grid(columns: 2)

クロマキー

chroma_key_img
|> Image.chroma_color()
|> then(&Image.new!(200, 200, color: &1, bands: 3))
|> Image.Kino.show()
{rgb, alpha} = Image.split_alpha(chroma_key_img)
[
  chroma_key_img,
  Image.chroma_mask!(rgb)
]
|> Enum.map(&Image.Kino.show(&1, max_height: 400))
|> Kino.Layout.grid(columns: 2)
[
  chroma_key_img,
  Image.chroma_key!(rgb)
]
|> Enum.map(&Image.Kino.show(&1, max_height: 400))
|> Kino.Layout.grid(columns: 2)