Image
Mix.install([
{:image, "~> 0.54"},
{:req, "~> 0.5"},
{:kino, "~> 0.14"}
])
画像の読込
ファイルから
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.jpg"
|> 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)