Skip to content

antoineedy/istacky

Repository files navigation

Downloads Downloads Downloads


Logo

IStacky

A Python lightweight image processing library
Explore the docs »

Example · Changelog · Todo List . PyPi


📚 About The Project

Usage of istacky

IStacky is a Python lightweight image processing library based on the ipywidgets library and designed to be used in Jupyter Notebooks. The main idea is to provide a simple and intuitive interface to stack images and apply number of modifications to them, such as cropping, resizing or background removal.

This project has been made to be used in the context of machine learning and computer vision projects, where the user needs to quickly and easily create output images that combines several images: plots, photos, logos etc.

(back to top)

🧑‍💻 Installation

using pip: (recommended)

pip install istacky

from source code:

Clone the repo, create a virtual environment and install using pip:

git clone https://github.com/antoineedy/istacky.git
cd istacky
python3 -m venv .
source bin/activate
pip install -e .

(back to top)

🔎 Usage

IStacky is meant to be used in Jupyter Notebooks. Do not forget to have a look at the documentation for more details! You can also access the a look at the example notebook for an example you can run at home.

📹 Video tutorial

IMAGE ALT TEXT

Access the French version here.

📓 Example

In our example, we want to create an output image, with a tennis point in background, and some plots, a circle and a logo on top of it. We will first import the libraries needed:

from PIL import Image
import istacky

Then load the images we want to stack:

background = Image.open("image/background.png")
plot = Image.open("image/plot.png")
circle = Image.open("image/circle.png")
logo = Image.open("image/logo.png")

Create a BlendedImage object and display it:

blended = istacky.BlendedImage(background, [plot, circle, logo])
blended.show()

First output

The images are just stacked on top of each other! Let's apply some modifications to them:

blended.editor()

Editor

Calling editor displays a widget that allows you to apply modifications to the images. You can crop, resize, change the opacity, remove the background, add images, change the orders of the layers etc. In our case, we want to put the logo in one corner, circle the position of the ball and add a plot of the trajectory of the ball. After the changes, here is the final result:

blended.show()

Final output

Now, if we want to apply the same modifications to another image, we can have access to the code that was used to create the final image, and apply it to another one:

my_code = blended.get_code()

Let's import the new images.

background2 = Image.open("image/background2.png")
plot2 = Image.open("image/plot2.png")
circle2 = Image.open("image/circle2.png")

We specify the code that was used to create the first image, and apply it to the new images:

new_blended = istacky.BlendedImage(
    background=plot2,
    images = [plot2, circle2, logo],
    code=my_code
    )
    
new_blended.show()

Final output

We can see that the modifications have been applied to the new images!

(back to top)

⚙️ GUI options

Widget Function Values
Logo Switch between layers $l \in ⟦1, N_{images}⟧$
Logo Reposition the image ($x$ and $y$ coordinates) $x \in [-I_{w}, Bg_{w} + I{w}]$
$y \in [-Y_{h}, Bg_{h} + I_{h}]$
Logo Change the opacity of the selected layer $o\in[0, 1]$
Logo Remove one color of the selected layer $[r, g, b] \in ⟦0, 255⟧^3$
Logo How close the removed colors must be from the selected color $t\in[0, 100]$
Logo The height of the selected image in % of the background height $s\in]0, 2]$
Logo Percentage of the selected image cropped in all 4 directions, and reseting the crop $c\in[0, 100]$
Logo Show the selected layer in the final image $s\in{True, False}$
Logo Crop or expand the background image (in pixels) in all 4 directions $c\in \mathbb{Z}$
Logo Reset the cropping of the background
Logo Copy the code of the current output to the clipboard
Logo Make a red border appear on the selected layer for editing purposes (does not appear on the final output) $v\in{True, False}$
Logo Set the size of the image displayed in pixels to fit all screen sizes (does not change the output size) $d\in]0, 1000]$
Logo Upload a new image to stack. Creates a new layer.
Logo To choose the new image to add from the user's computer. Made with ipyfilechooser

🗺️ Future of the project

I wonder if I (we?) should extend this project to create a Photoshop-like interface using the ipywidgets library. I really don't know any use to this project. Either way, click here to access the todo list which contains the list of things to do for the project, and let me know if you have any ideas!

(back to top)

👨‍👩‍👧‍👦 Contributing

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement".

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/MyFeature)
  3. Commit your Changes (git commit -m 'Would be great!')
  4. Push to the Branch (git push origin feature/MyFeature)
  5. Open a Pull Request

(back to top)

📜 License

Distributed under the MIT License. See LICENSE for more information.

(back to top)

🎯 Contact

My name is Antoine EDY. Here are my LinkedIn and my Github profiles, and you can send me an email to antoineedy@outlook.fr.

(back to top)

About

A lightweight image processing library

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published