机器学习实战项目一(卡通化图像)

2024-06-03 10:12

本文主要是介绍机器学习实战项目一(卡通化图像),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

在 Python 中使用 OpenCV 卡通化图像

什么是OpenCV?

我们要建造什么?

开发Image Cartoonifier的步骤

下载图片卡通化代码

第 1 步:导入所需的模块

步骤 2:构建文件框以选择特定文件

第 3 步:如何存储图像?

第 4 步:将图像转换为灰度

第 5 步:平滑灰度图像

第 6 步:检索图像的边缘

第 7 步:准备蒙版图像

第 8 步:赋予卡通效果

第 9 步:将所有过渡绘制在一起

步骤10:保存按钮的功能

第 11 步:制作主窗口

第 12 步:制作 卡通化 主窗口中的按钮

第 13 步:在主窗口中制作“保存”按钮

第 14 步:构建 tkinter 窗口的 main 函数


此为开源项目(法典结合代码一起看)

在 Python 中使用 OpenCV 卡通化图像

什么是OpenCV?

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由Intel于1999年发起,现在由Willow Garage主导,并由全世界开源社区共同维护。OpenCV是一个跨平台库,可以在Windows、Linux、macOS、Android和iOS等操作系统上运行。它包含了大量的计算机视觉算法,如图像处理、特征检测与描述、运动跟踪、目标识别、三维重建以及机器学习等。

OpenCV的主要应用领域包括实时计算机视觉、机器人技术、人机交互、物体识别、运动分析、安全监控、图像分割、自动驾驶等。由于其丰富的功能和高效的性能,OpenCV已经成为计算机视觉领域最受欢迎的库之一。

使用OpenCV,开发者可以轻松地处理和分析图像和视频数据,实现各种复杂的计算机视觉任务。它提供了大量的API和工具,使得开发者能够快速地构建出高效的计算机视觉应用。

如果你对计算机视觉或图像处理感兴趣,学习OpenCV将是一个很好的选择。

我们要建造什么?

我们的目标是将图像转换为卡通。我们将构建一个 python 应用程序,该应用程序将使用 OpenCV 将图像转换为其卡通。

我们的目标是构建一个应用程序,如下所示:

卡通化输出

原始图像:

原始图像

广告

开发Image Cartoonifier的步骤

下载图片卡通化代码

请下载Image Cartoonfier Project的源代码:Cartoonify an Image in Python

或者

import cv2 #for image processing
import easygui #to open the filebox
import numpy as np #to store image
import imageio #to read image stored at particular pathimport sys
import matplotlib.pyplot as plt
import os
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Imagetop=tk.Tk()
top.geometry('400x400')
top.title('Cartoonify Your Image !')
top.configure(background='white')
label=Label(top,background='#CDCDCD', font=('calibri',20,'bold'))def upload():ImagePath=easygui.fileopenbox()cartoonify(ImagePath)def cartoonify(ImagePath):# read the imageoriginalmage = cv2.imread(ImagePath)originalmage = cv2.cvtColor(originalmage, cv2.COLOR_BGR2RGB)#print(image)  # image is stored in form of numbers# confirm that image is chosenif originalmage is None:print("Can not find any image. Choose appropriate file")sys.exit()ReSized1 = cv2.resize(originalmage, (960, 540))#plt.imshow(ReSized1, cmap='gray')#converting an image to grayscalegrayScaleImage= cv2.cvtColor(originalmage, cv2.COLOR_BGR2GRAY)ReSized2 = cv2.resize(grayScaleImage, (960, 540))#plt.imshow(ReSized2, cmap='gray')#applying median blur to smoothen an imagesmoothGrayScale = cv2.medianBlur(grayScaleImage, 5)ReSized3 = cv2.resize(smoothGrayScale, (960, 540))#plt.imshow(ReSized3, cmap='gray')#retrieving the edges for cartoon effect#by using thresholding techniquegetEdge = cv2.adaptiveThreshold(smoothGrayScale, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9)ReSized4 = cv2.resize(getEdge, (960, 540))#plt.imshow(ReSized4, cmap='gray')#applying bilateral filter to remove noise #and keep edge sharp as requiredcolorImage = cv2.bilateralFilter(originalmage, 9, 300, 300)ReSized5 = cv2.resize(colorImage, (960, 540))#plt.imshow(ReSized5, cmap='gray')#masking edged image with our "BEAUTIFY" imagecartoonImage = cv2.bitwise_and(colorImage, colorImage, mask=getEdge)ReSized6 = cv2.resize(cartoonImage, (960, 540))#plt.imshow(ReSized6, cmap='gray')# Plotting the whole transitionimages=[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')save1=Button(top,text="Save cartoon image",command=lambda: save(ReSized6, ImagePath),padx=30,pady=5)save1.configure(background='#364156', foreground='white',font=('calibri',10,'bold'))save1.pack(side=TOP,pady=50)plt.show()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 "+ pathtk.messagebox.showinfo(title=None, message=I)upload=Button(top,text="Cartoonify an Image",command=upload,padx=10,pady=5)
upload.configure(background='#364156', foreground='white',font=('calibri',10,'bold'))
upload.pack(side=TOP,pady=50)top.mainloop()
第 1 步:导入所需的模块

我们将导入以下模块:

  • CV2:导入以使用 OpenCV 进行图像处理
  • easygui:导入以打开文件框。它允许我们从系统中选择任何文件。
  • Numpy:图像以数字的形式存储和处理。这些被当作数组。我们使用 NumPy 来处理数组。
  • Imageio:用于读取使用路径的文件框选择的文件。
  • Matplotlib:此库用于可视化和绘图。因此,它被导入以形成图像的情节。
  • 操作系统:用于操作系统交互。在这里,读取路径并将图像保存到该路径。

法典:

导入 CV2 #for 图像处理
导入 Easygui #to 打开文件框
将 numpy 导入为 NP #to 存储映像
导入 imageio #to 读取存储在特定路径上的图像
导入系统
导入 matplotlib。pyplot 作为 plt
导入操作系统
将 tkinter 导入为 tk
从 tkinter 导入文件对话框
从 TKINTER 导入*
从 PIL 导入 ImageTk, Image
步骤 2:构建文件框以选择特定文件

在此步骤中,我们将构建应用程序的主窗口,按钮、标签和图像将驻留在其中。我们还通过 title() 函数给它一个标题。

法典:

""“ fileopenbox 打开框以选择文件
并帮助我们将文件路径存储为字符串”""
def upload()
ImagePath=easygui。文件OpenBox()
卡通化ImagePath)

解释:

上面的代码打开文件框,即从设备中选择文件的弹出框,每次运行代码时都会打开。fileopenbox() 是 easyGUI 模块中的方法,它将所选文件的路径以字符串形式返回。

注意:现在,所有操作都将在单击按钮时完成,因此以下所有步骤都是函数 cartoonify (ImagePath) 的一部分

def cartoonifyImagePath
第 3 步:如何存储图像?

现在,试想一下,程序将如何读取图像?对于计算机来说,一切都只是数字。因此,在下面的代码中,我们将图像转换为numpy数组。

法典:

#read 图像
原始法师 = CV2。imread图像路径)
原始法师 = CV2。cvtColororiginalmage, cv2.COLOR_BGR2RGB)
#print(image) # 图像以数字形式存储
# 确认镜像被选中
如果 originalmage 为 None:
print“找不到任何图像。选择合适的文件”)
系统。退出()
ReSized1 = cv2。resize原始法师, 960540))
#plt.imshow(ReSized1, cmap='gray')

解释:

Imread 是 cv2 中的一种方法,用于以数字形式存储图像。这有助于我们根据需要执行操作。图像被读取为numpy数组,其中单元格值描述了像素的R、G和B值。

注意:我们在每次转换后调整图像大小,以最终以相似的比例显示所有图像。

从图像转换开始:

要将图像转换为卡通,需要进行多次转换。首先,将图像转换为灰度图像。是的,和以前的照片差不多。!然后,对灰度图像进行平滑处理,并尝试提取图像中的边缘。最后,我们形成一个彩色图像并用边缘遮罩它。这将创建一个美丽的卡通图像,其边缘和原始图像的颜色变浅。

让我们从这些转换开始,将图像转换为卡通图像。

第 4 步:将图像转换为灰度

法典:

#converting 图像转换为灰度
grayScaleImage = cv2。cvtColororiginalmage, cv2.COLOR_BGR2GRAY)
ReSized2 = cv2。resizegrayScaleImage, 960540))
#plt.imshow(ReSized2, cmap='gray')

解释:

cvtColor(image, flag) 是 cv2 中的一种方法,用于将图像转换为称为“flag”的颜色空间。在这里,我们的第一步是将图像转换为灰度。因此,我们使用 BGR2GRAY 标志。这将以灰度返回图像。灰度图像存储为 grayScaleImage。

每次转换后,我们使用 cv2 中的 resize() 方法调整生成的图像大小,并使用 imshow() 方法显示它。这样做是为了更清楚地了解每个转型步骤。

上面的代码将生成以下输出:

灰色图像

第 5 步:平滑灰度图像

法典:

#applying 中位模糊以平滑图像
smoothGrayScale = cv2。medianBlur灰度图像,5)
ReSized3 = cv2。调整大小smoothGrayScale, 960540))
#plt.imshow(ReSized3, cmap='gray')

解释:

为了使图像平滑,我们只需应用模糊效果即可。这是使用 medianBlur() 函数完成的。在这里,中心像素被分配了属于内核的所有像素的平均值。反过来,创建模糊效果。

上面的代码生成以下输出:

光滑的灰色

第 6 步:检索图像的边缘

法典:

#retrieving the edges for cartoon effect
#by using thresholding technique
getEdge = cv2.adaptiveThreshold(smoothGrayScale, 255,
cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY, 9, 9)
ReSized4 = cv2.resize(getEdge, (960, 540))
#plt.imshow(ReSized4, cmap='gray')

解释:

卡通效果有两个特点:

  1. 突出显示的边缘
  2. 平滑的色彩

在此步骤中,我们将研究第一个专业。在这里,我们将尝试检索边缘并突出显示它们。这是通过自适应阈值技术实现的。阈值是邻域像素值面积减去常数 C 的平均值,C 是从邻域像素的平均值或加权和中减去的常数。Thresh_binary 是应用的阈值类型,其余参数确定块大小。

第 7 步:准备蒙版图像

法典:

#applying 双边滤波器,可消除噪声
#and 根据需要保持边缘锋利
colorImage = cv2。bilateralFilteroriginalmage, 9300300)
ReSized5 = cv2。resizecolorImage, 960540))
#plt.imshow(ReSized5, cmap='gray')

解释:

在上面的代码中,我们终于研究了第二个专业。我们准备一个浅色的彩色图像,最后用边缘遮罩以产生卡通图像。我们使用 bilateralFilter 来消除噪声。它可以在一定程度上被视为图像的平滑化。

第三个参数是像素邻域的直径,即某个像素周围的像素数,这将决定其值。第四个和第五个参数定义 signmaColor 和 sigmaSpace。这些参数用于产生西格玛效果,即使图像看起来恶毒,像水漆一样,去除颜色的粗糙度。

是的,它类似于现代手机相机中的美化或AI效果。

上面的代码生成以下输出:

颜色蒙版

第 8 步:赋予卡通效果

法典:

使用我们的“美化”图像 #masking 边缘图像
卡通图像 = cv2。bitwise_andcolorImage, colorImage, mask=getEdge)
ReSized6 = cv2。resize卡通图像, 960540))
#plt.imshow(ReSized6, cmap='gray')

解释:

所以,让我们把这两个专业结合起来。这将使用 MASKING 完成。我们按位执行,并对两个图像进行遮罩。还记得,图像只是数字吗?

是的,这就是我们在“美化”图像上遮盖边缘图像的方式。

这终于卡通化了我们的形象!

上面的代码将生成如下所示的输出:

卡通效果

第 9 步:将所有过渡绘制在一起

法典:

# 绘制整个过渡
图像=[ReSized1, ReSized2, ReSized3, ReSized4, ReSized5, ReSized6]
图,轴 = PLT。subplots3,2, figsize=8,8, subplot_kw={'xticks'[]'yticks'[]}, gridspec_kw=dicthspace=0.1, wspace=0.1))
对于 i,exnumerate axes.
斧头。imshowimages[i], cmap='灰色')
保存按钮代码
PLT。显示()

解释:

要绘制所有图像,我们首先列出所有图像。此处的列表名为“images”,包含所有调整大小的图像。现在,我们在图中创建类似 subl=plots 的轴,并使用 imshow() 方法在轴上的每个块中显示一对一的图像。

plt.show() 在绘制每个子图后立即绘制整个图。

上面的代码将生成如下所示的输出:

卡通化输出

 

步骤10:保存按钮的功能
def saveReSized6, ImagePath
使用 imwrite() #saving 图像
newName=“cartoonified_Image”
path1 = 操作系统。路径dirnameImagePath)
扩展=操作系统。路径splitext图像路径)[1]
路径 = 操作系统。路径joinpath1, newName+扩展名)
简历2。imwrite路径,cv2.cvtColorReSized6, cv2.COLOR_RGB2BGR))
I = “按名称保存的图像” + newName +“ 在 ”+ 路径
传统知识。message框showinfotitle=None, message=I)

解释:

在这里,我们的想法是保存生成的图像。为此,我们采用旧路径,只需将尾部(旧文件的名称)更改为新名称,并通过将新名称附加到文件的头部,将具有新名称的卡通化图像存储在同一文件夹中。

为此,我们通过 os.path.dirname() 方法提取文件路径的头部。同样,os.path.splitext(ImagePath)[1] 用于从路径中提取文件的扩展名。

在这里,newName 将“Cartoonified_Image”存储为新文件的名称。os.path.join(path1, newName + extension) 将路径的头部连接到 newname 和扩展名。这将形成新文件的完整路径。

cv2 的 imwrite() 方法用于将文件保存在提到的路径中。cv2.cvtColor(ReSized6, cv2.COLOR_RGB2BGR) 用于确保在保存图像时不会提取或突出显示任何颜色。因此,最后,用户将获得确认图像已保存为文件的名称和路径。

使用按钮执行后,此函数将产生以下输出:

第 11 步:制作主窗口
top=tk。Tk的()
返回页首。几何'400x400')
返回页首。title'卡通化你的形象!)
返回页首。配置background='白色')
label=Labeltop,background='#CDCDCD', font='calibri'20'粗体'))
第 12 步:制作 卡通化 主窗口中的按钮
upload=Buttontop,text=“卡通化图像”,command=upload,padx=10,pady=5)
上传。configurebackground='#364156', foreground='white',font='calibri'10'粗体'))
上传。packside=TOP,pady=50)
第 13 步:在主窗口中制作“保存”按钮
save1=Buttontop,text=“保存卡通图片”,command=lambda: saveImagePath, ReSized6,padx=30,pady=5)
保存 1。configurebackground='#364156', foreground='white',font='calibri'10'粗体'))
保存 1。packside=TOP,pady=50)

上面的代码在图像转换完成后立即创建一个按钮。它为用户提供了保存卡通化图像的选项。

第 14 步:构建 tkinter 窗口的 main 函数
返回页首。主循环()

最终结果:

图片保存

这篇关于机器学习实战项目一(卡通化图像)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026693

相关文章

Nginx部署React项目时重定向循环问题的解决方案

《Nginx部署React项目时重定向循环问题的解决方案》Nginx在处理React项目请求时出现重定向循环,通常是由于`try_files`配置错误或`root`路径配置不当导致的,本文给大家详细介... 目录问题原因1. try_files 配置错误2. root 路径错误解决方法1. 检查 try_f

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen