Создайте карандашный набросок приложения с графическим интерфейсом из фотографии в Python

Опубликовано: 14 Декабря, 2022

В этой статье мы расскажем, как конвертировать изображения в акварельные наброски и карандашные наброски Linux.

Эскиз и живопись используются художниками многих дисциплин для сохранения идей, воспоминаний и мыслей. Знакомство с искусством, от рисования и скульптуры до посещения художественного музея, обеспечивает множество преимуществ для хорошего самочувствия, включая снижение стресса и улучшение способностей к критическому мышлению. Рисование, наброски и, в частности, рисование связаны с повышением творческих способностей, памяти и снятием стресса и используются в арт-терапии.

Благодаря этой статье мы теперь можем создать веб-приложение для прямого преобразования изображения в эскиз с использованием фреймворка Python Streamlit. Пользователь может загрузить изображение, чтобы преобразовать его либо в акварельный, либо в карандашный рисунок. Пользователь может дополнительно загрузить преобразованное изображение, перед этим давайте разберемся с некоторыми определениями, которые мы будем использовать в этой статье.

  • Streamlit — Streamlit — это популярная среда веб-приложений с открытым исходным кодом среди разработчиков Python. Он совместим с широким спектром часто используемых библиотек, включая Keras, Sklearn, Numpy и pandas.
  • PIL — PIL расшифровывается как Python Imaging Library. Это пакет для обработки изображений на языке программирования Python. Он включает в себя легкие инструменты обработки изображений, которые помогают редактировать, создавать и хранить изображения.
  • Numpy — Numpy — это широко используемая библиотека программирования Python, используемая для высокоуровневых математических вычислений.
  • cv2 — эта библиотека используется для решения задач компьютерного зрения.

Требуется пакет

pip install streamlit
pip install opencv-python
pip install numpy
pip install Pillow

Поэтапная реализация

Шаг 1: Установите Streamlit

Точно так же мы установим PIL, Numpy и cv2.

Шаг 2. Проверьте, работает ли установка

streamlit hello

Шаг 3: Теперь запустите веб-приложение Streamlit. Нам нужно ввести следующую команду

streamlit run app.py

Шаг 4: Теперь веб-приложение успешно запущено. Вы можете получить доступ к веб-приложению через локальный URL-адрес или сетевой URL-адрес.

Шаг 5: Создайте новую папку с именем «Веб-приложение» для преобразования изображений в эскизы.

Шаг 6: Вставьте код веб-приложения в файл app.py и сохраните файл.

Первоначально в коде мы импортируем все необходимые фреймворки, пакеты, библиотеки и модули, которые будем использовать для создания веб-приложения. Кроме того, мы должны использовать пользовательские функции, используемые для преобразования изображения в акварельный набросок и для преобразования изображения в карандашный набросок. Существует также функция загрузки изображения с использованием библиотеки PIL. Основная функция содержит код для веб-приложения. Изначально у нас есть несколько заголовков и подзаголовков, которые помогут пользователю загрузить изображение. Для загрузки изображения мы использовали загрузчик файлов streamlit . Мы также предоставляем пользователю раскрывающееся меню для выбора между созданием акварельного наброска или созданием карандашного наброска, а затем, в зависимости от их выбора, мы визуализируем результаты. Исходное изображение и изображение после применения фильтра визуализируются рядом друг с другом, так что пользователь может сравнить оба изображения, чтобы увидеть результаты. Наконец, пользователь также может загрузить образ на свой локальный компьютер. Это делается с помощью кнопки загрузки Streamlit.

Полный код

Python3




# import the frameworks, packages and libraries
import streamlit as st
from PIL import Image
from io import BytesIO
import numpy as np
import cv2  # computer vision
  
# function to convert an image to a 
# water color sketch
def convertto_watercolorsketch(inp_img):
    img_1 = cv2.edgePreservingFilter(inp_img, flags=2, sigma_s=50, sigma_r=0.8)
    img_water_color = cv2.stylization(img_1, sigma_s=100, sigma_r=0.5)
    return(img_water_color)
  
# function to convert an image to a pencil sketch
def pencilsketch(inp_img):
    img_pencil_sketch, pencil_color_sketch = cv2.pencilSketch(
        inp_img, sigma_s=50, sigma_r=0.07, shade_factor=0.0825)
    return(img_pencil_sketch)
  
# function to load an image
def load_an_image(image):
    img = Image.open(image)
    return img
  
# the main function which has the code for
# the web application
def main():
    
    # basic heading and titles
    st.title("WEB APPLICATION TO CONVERT IMAGE TO SKETCH")
    st.write("This is an application developed for converting
    your ***image*** to a ***Water Color Sketch*** OR ***Pencil Sketch***")
    st.subheader("Please Upload your image")
      
    # image file uploader
    image_file = st.file_uploader("Upload Images", type=["png", "jpg", "jpeg"])
  
    # if the image is uploaded then execute these 
    # lines of code
    if image_file is not None:
        
        # select box (drop down to choose between water 
        # color / pencil sketch)
        option = st.selectbox("How would you like to convert the image",
                              ("Convert to water color sketch",
                               "Convert to pencil sketch"))
        if option == "Convert to water color sketch":
            image = Image.open(image_file)
            final_sketch = convertto_watercolorsketch(np.array(image))
            im_pil = Image.fromarray(final_sketch)
  
            # two columns to display the original image and the
            # image after applying water color sketching effect
            col1, col2 = st.columns(2)
            with col1:
                st.header("Original Image")
                st.image(load_an_image(image_file), width=250)
  
            with col2:
                st.header("Water Color Sketch")
                st.image(im_pil, width=250)
                buf = BytesIO()
                img = im_pil
                img.save(buf, format="JPEG")
                byte_im = buf.getvalue()
                st.download_button(
                    label="Download image",
                    data=byte_im,
                    file_name="watercolorsketch.png",
                    mime="image/png"
                )
  
        if option == "Convert to pencil sketch":
            image = Image.open(image_file)
            final_sketch = pencilsketch(np.array(image))
            im_pil = Image.fromarray(final_sketch)
              
            # two columns to display the original image
            # and the image after applying
            # pencil sketching effect
            col1, col2 = st.columns(2)
            with col1:
                st.header("Original Image")
                st.image(load_an_image(image_file), width=250)
  
            with col2:
                st.header("Pencil Sketch")
                st.image(im_pil, width=250)
                buf = BytesIO()
                img = im_pil
                img.save(buf, format="JPEG")
                byte_im = buf.getvalue()
                st.download_button(
                    label="Download image",
                    data=byte_im,
                    file_name="watercolorsketch.png",
                    mime="image/png"
                )
  
  
if __name__ == "__main__":
    main()

Выход: