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

Pythonx Image Conversion

pythonx_image_processing.livemd

Pythonx Image Conversion

Mix.install([
  {:pythonx, "~> 0.4.2"},
  {:kino_pythonx, "~> 0.1.0"},
  {:evision, "~> 0.2.13"},
  {:image, "~> 0.59.3"}
])
[project]
name = "project"
version = "0.0.0"
requires-python = "==3.13.*"
dependencies = [
  "opencv-python == 4.11.*",
  "pillow == 11.2.*"
]

OpenCV to Evision

import io

import cv2
import numpy as np

from PIL import Image
img = np.zeros((200, 300, 3), np.uint8)
img[:,:,0] = 255

img
Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
l_img = img.tolist()
l_img
|> Pythonx.decode()
|> Nx.tensor(type: :u8)
|> Evision.Mat.from_nx_2d()
b_img = img.tobytes()
b_img
ex_img =
  b_img
  |> Pythonx.decode()
  |> Evision.Mat.from_binary(:u8, 200, 300, 3)

Evision to OpenCV

sky_img =
  [255, 255, 0]
  |> Nx.tensor(type: :u8)
  |> Nx.broadcast({200, 300, 3})
  |> Evision.Mat.from_nx_2d()
py_b_img = Evision.Mat.to_binary(sky_img)
py_b_img
py_img = np.frombuffer(py_b_img, dtype=np.uint8)
py_img = np.reshape(py_img, [200, 300, 3])
py_img
Image.fromarray(cv2.cvtColor(py_img, cv2.COLOR_BGR2RGB))

Pillow to Evision

pil_img = Image.new("RGB", (300, 200), (0, 255, 0))
pil_img
pil_b_img = io.BytesIO()
pil_img.save(pil_b_img, format='PNG')
pil_b_img = pil_b_img.getvalue()
pil_b_img
ex_pil_img =
  pil_b_img
  |> Pythonx.decode()
  |> Evision.imdecode(Evision.Constant.cv_IMREAD_COLOR())

Evision to Pillow

png_img = Evision.imencode(".png", ex_pil_img)
png_img
Image.open(io.BytesIO(png_img))

Pillow to Image

pil_yellow_img = Image.new("RGB", (300, 200), (255, 255, 0))
pil_yellow_img
pil_yb_img = io.BytesIO()
pil_yellow_img.save(pil_yb_img, format='PNG')
pil_yb_img = pil_yb_img.getvalue()
pil_yb_img
ex_yellow_img =
  pil_yb_img
  |> Pythonx.decode()
  |> Image.from_binary!()

Image to Pillow

ex_yb_img = Image.write!(ex_yellow_img, :memory, suffix: ".png")
ex_yb_img
Image.open(io.BytesIO(ex_yb_img))