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

Conversion

livebooks/vix/conversion.livemd

Conversion

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

画像の読込

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

Image -> Nx

nx_ryo_img = Image.to_nx!(ryo_img)

Kino.Image.new(nx_ryo_img)

Nx -> Image

{:ok, image_ryo_img} = Image.from_nx(nx_ryo_img)

image_ryo_img

Image -> evision

{:ok, evision_ryo_img} =
  ryo_img
  |> Image.split_alpha()
  |> elem(0)
  |> Image.to_evision()

evision_ryo_img

evision -> Image

{:ok, image_ryo_img} = Image.from_evision(evision_ryo_img)

image_ryo_img

組み合わせ処理

input =
  Nx.tensor(
    [
      [0, 0],
      [0, 512],
      [512, 0],
      [512, 512]
    ],
    type: :f32
  )

output =
  Nx.tensor(
    [
      [192, 256],
      [0, 512],
      [320, 256],
      [512, 512]
    ],
    type: :f32
  )

perspective_mat = Evision.getPerspectiveTransform(input, output)

ryo_img
|> Image.split_alpha()
|> elem(0)
|> Image.Draw.rect!(190, 200, 180, 200, fill: false, color: :red, stroke_width: 24)
|> Image.to_evision()
|> elem(1)
|> Evision.warpPerspective(perspective_mat, {512, 512})
|> Image.from_evision()
|> elem(1)