This article was published as a part of the Data Science Blogathon.
In this article, we will build one interesting application that will cartoonify the image provided to it. To build this cartoonifyer application we will use python and OpenCV. This is one of the exciting and thrilling applications of Machine Learning. While building this application we will also see how to use libraries like easygui, Tkinter, and all. Here you have to select the image and then the application will convert that image into its cartoon form. Mainly, we build this application using OpenCV and python as the programming languages.
Let’s get started.
OpenCV is an open-source library in python that is used mainly for computer vision tasks in the areas of machine learning and artificial intelligence. Nowadays, openCV is playing a major role in the field of technology. Using OpenCV we can process images and videos for some tasks like object detection, face detection, object tracking, and all.
OpenCV has c, c++, java, and python interfaces and it supports all kinds of systems such as Windows, Linux, Android, Mac OS, IoS, and all…
Python: We use python as a programming language for building the application.
cv2: We use cv2 for image processing.
Numpy: Mainly NumPy is used for dealing with arrays. Here the images that we use are stored in the form of arrays. So for that, we use NumPy.
easygui: easygui is a module used for GUI programming in python. In our application easygui is used to open the file box to upload images from the local system.
Imageio: Imageio is a python library that reads and writes the images.
Matplotlib: Matplotlib is used for visualization purposes. Here we plot the images using matplotlib.
OS: Here in our application os is used for dealing with paths like reading images from the path and saving the image to the path.
Tkinter: Tkinter is a standard Graphical User Interface(GUI) package.
This is the methodology that we are going to follow to build our cartoonify application. First of all using easygui, we will upload the image, and then the image is converted to a greyscale image.
The next two steps are the important steps to converting images into cartoon images. They are smoothening and then retrieving the edges. In this color of the image is smoothened to give the cartoon look and then we retrieve the edges and then highlight them in the final image.
Next, we will prepare a mask Image. In this, we use the bilateral filter with removes the noise and smoothen it to some extent. Now the final step is giving the cartoon effect. To the image which we got in the previous step, we combine our two important steps and finally give a mask-edged image that looks like a cartoon image.
Let’s move on to the coding part.
Start by importing all the required libraries such as NumPy, cv2, easygui, imageio, sys,matplotlib, os, and required Tkinter libraries. The importance of these libraries is discussed before.
Python Code:
# import the necessary packages
import cv2
import imutils
#import the required libraries
#import cv2
import easygui
import imageio
import sys
import matplotlib.pyplot as plt
import os
import numpy as np
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
To upload the image from the local system, define an upload function and use a fileopenbox that opens the box to choose a file, and stores the file path.
Now create a function cartoonify which includes all the steps from converting to greyscale to the final cartoon image. The first step is to convert it into a greyscale image and then apply the blur to smoothen the image which is one of the main steps in cartooning the image. For smoothening, the blur effect is given using the median blur() function. and then retrieving the edges and highlighting for cartoon effect which is another important step of the application and then applying the bilateral filter which is in built that helps to remove the noise present in the image and provides the clean image and then masking the edged image and Finally we plot an image which contains all the six traditions throughout the process.
To plot all the transitions, we form a list of all images. We have saved all the images from first as ReSized1, ReSized2, ReSized3, ReSized4, ReSized5, ReSized6. On a single plot, we will plot all these six. And then finally plt. show() will print all the images.
def cartoonify(ImagePath): originalmage = cv2.imread(ImagePath) originalmage = cv2.cvtColor(originalmage, cv2.COLOR_BGR2RGB) # check if the image is chosen if originalmage is None: print("Can not find any image. Choose appropriate file") sys.exit() ReSized1 = cv2.resize(originalmage, (960, 540)) grayScaleImage = cv2.cvtColor(originalmage, cv2.COLOR_BGR2GRAY) ReSized2 = cv2.resize(grayScaleImage, (960, 540))
#applying median blur to smoothen an image smoothGrayScale = cv2.medianBlur(grayScaleImage, 5) ReSized3 = cv2.resize(smoothGrayScale, (960, 540))
#retrieving the edges for cartoon effect getEdge = cv2.adaptiveThreshold(smoothGrayScale, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9) ReSized4 = cv2.resize(getEdge, (960, 540))
#applying bilateral filter to remove noise #and keep edge sharp as required colorImage = cv2.bilateralFilter(originalmage, 9, 300, 300) ReSized5 = cv2.resize(colorImage, (960, 540)) #masking edged image with our "BEAUTIFY" image cartoonImage = cv2.bitwise_and(colorImage, colorImage, mask=getEdge) ReSized6 = cv2.resize(cartoonImage, (960, 540)) #Plotting the whole transition images=[ReSized1, ReSized2, ReSized3, ReSized4, ReSized5, ReSized6] fig, axes = plt.subplots(3,2, figsize=(8,8), subplot_kw={'xticks':[], 'yticks':[]}, gridspec_kw=dict(hspace=0.1, wspace=0.1)) for i, ax in enumerate(axes.flat): ax.imshow(images[i], cmap='gray') plt.show()
For the main window where we upload the image. When we run the code, a new window will pop up that gives the option to upload the image from the desktop. Here we set the geometry like the size of the window, and the title of the window which we set to ” Cartoonify Your Image !” and then set the labeling style.
top=tk.Tk() top.geometry('500x500') top.title('Cartoonify Your Image !') top.configure(background='#eadbc8') label=Label(top,background='#eadbc8', font=('ariel',20,'bold'))
In the main window make the cartoonify button. This button helps in uploading the image from the desktop. Here we will set what the button should look like. The color of the button, its position on the window, the style of the text on it, and all.
upload=Button(top,text="Cartoonify an Image",command=upload,padx=50,pady=10) upload.configure(background='blue', foreground='white',font=('ariel',10,'bold')) upload.pack(side=TOP,pady=200)
This is what the window looks like. When you run the application, this window will pop up with a button naming Catoonify your Image. Using this button you have to upload the image from your desktop.
we can also save the image in the local system. But in this application, we just give the cartoon effect to the image. To save the image,
def save(ReSized6, ImagePath): #saving an image using imwrite() newName="cartoonified_Image" path1 = os.path.dirname(ImagePath) extension=os.path.splitext(ImagePath)[1] path = os.path.join(path1, newName+extension) cv2.imwrite(path, cv2.cvtColor(ReSized6, cv2.COLOR_RGB2BGR)) I = "Image saved by name " + newName +" at "+ path tk.messagebox.showinfo(title=None, message=I)
For creating the save button on the main window, use the following code.
save1=Button(top,text="Save cartoon image",command=lambda: save(ImagePath, ReSized6),padx=30,pady=5) save1.configure(background='#364156', foreground='white',font=('calibri',10,'bold')) save1.pack(side=TOP,pady=50)
Finally, run it to get the output with all the transitions of the image.
top.mainloop()
Finally, we will get the output image as shown above. It contains all the 6 transitions of the image. And the final image is the cartoon image. I hope you have enjoyed this application. This is the “Cartoon Version” of the image. Now using this application, you can create your cartoon image. This is Thrilling!!!!!!
Overall in this article, we have seen
The media shown in this article is not owned by Analytics Vidhya and is used at the Author’s discretion.