python实现对图油画、卡通、梦幻、草图、水彩效果

本篇博客将介绍如何使用wxPython模块和OpenCV库来实现对图像进行灰度化、二值化、伽马校正、色彩空间转换和图像反转这5种效果的合并程序。程序可以通过wxPython提供的GUI界面来选择图片路径和效果类型,程序会将处理后的图像保存到指定路径并打开。

步骤一:安装wxPython和OpenCV库

首先需要安装wxPython和OpenCV库。可以使用pip命令来安装:

pip install wxPython
pip install opencv-contrib-python

步骤二:创建GUI界面

我们可以使用wxPython来创建一个GUI界面,包括一个选择文件路径的按钮、一个下拉框来选择效果类型、一个处理按钮和一个输出路径文本框。代码如下:

import cv2
import wx
import osclass ImageTransformer(wx.Frame):def __init__(self):super().__init__(parent=None, title='Image Transformer')self.panel = wx.Panel(self)self.image_path = Noneself.effect_choice = Noneself.create_widgets()self.Show()def create_widgets(self):# 创建选择文件按钮self.file_picker = wx.FilePickerCtrl(self.panel, wildcard='Image files (*.jpg;*.jpeg;*.png)|*.jpg;*.jpeg;*.png')self.file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, self.on_file_pick)# 创建效果选择下拉框self.effects = ['Oil Painting', 'Watercolor', 'Sketch', 'Cartoon', 'Dreamy']self.effect_choice = wx.Choice(self.panel, choices=self.effects)# 创建转换按钮self.transform_button = wx.Button(self.panel, label='Transform', size=(100, 30))self.transform_button.Bind(wx.EVT_BUTTON, self.on_transform)# 创建状态栏self.status_bar = self.CreateStatusBar()# 创建布局main_sizer = wx.BoxSizer(wx.VERTICAL)main_sizer.Add(self.file_picker, 0, wx.ALL|wx.EXPAND, 5)main_sizer.Add(self.effect_choice, 0, wx.ALL|wx.CENTER, 5)main_sizer.Add(self.transform_button, 0, wx.ALL|wx.CENTER, 5)self.panel.SetSizer(main_sizer)def on_file_pick(self, event):# 获取选择的文件路径self.image_path = event.GetPath()self.status_bar.SetStatusText(f'Selected file: {self.image_path}')

这是一个基于wxPython库的图像转换应用程序的代码。它创建了一个名为"Image Transformer"的窗口,并提供了以下功能:

  1. 创建选择文件按钮:使用wx.FilePickerCtrl创建一个按钮,允许用户选择图像文件。通过设置wildcard参数,只显示特定类型的图像文件(.jpg、.jpeg、.png)。

  2. 创建效果选择下拉框:使用wx.Choice创建一个下拉框,供用户选择要应用的图像效果。下拉框中提供了"Oil Painting"、"Watercolor"、"Sketch"、"Cartoon"和"Dreamy"这些选项。

  3. 创建转换按钮:使用wx.Button创建一个按钮,标有"Transform",用于触发图像转换操作。

  4. 创建状态栏:使用CreateStatusBar方法创建一个状态栏,用于显示当前选择的图像文件路径。

  5. 创建布局:使用wx.BoxSizer创建一个垂直布局管理器,将上述组件添加到主面板中,并设置相应的边距和对齐方式。

  6. on_file_pick方法:当用户选择图像文件时,该方法将获取所选文件的路径,并在状态栏中显示该路径。

步骤三:实现图像处理

在OnProcess函数中,我们需要实现图像的处理。我们可以使用OpenCV库来实现灰度化、二值化、伽马校正、色彩空间转换和图像反转这5种效果。代码如下:

import cv2
import wx
import osclass ImageTransformer(wx.Frame):def __init__(self):super().__init__(parent=None, title='Image Transformer')self.panel = wx.Panel(self)self.image_path = Noneself.effect_choice = Noneself.create_widgets()self.Show()def create_widgets(self):# 创建选择文件按钮self.file_picker = wx.FilePickerCtrl(self.panel, wildcard='Image files (*.jpg;*.jpeg;*.png)|*.jpg;*.jpeg;*.png')self.file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, self.on_file_pick)# 创建效果选择下拉框self.effects = ['Oil Painting', 'Watercolor', 'Sketch', 'Cartoon', 'Dreamy']self.effect_choice = wx.Choice(self.panel, choices=self.effects)# 创建转换按钮self.transform_button = wx.Button(self.panel, label='Transform', size=(100, 30))self.transform_button.Bind(wx.EVT_BUTTON, self.on_transform)# 创建状态栏self.status_bar = self.CreateStatusBar()# 创建布局main_sizer = wx.BoxSizer(wx.VERTICAL)main_sizer.Add(self.file_picker, 0, wx.ALL|wx.EXPAND, 5)main_sizer.Add(self.effect_choice, 0, wx.ALL|wx.CENTER, 5)main_sizer.Add(self.transform_button, 0, wx.ALL|wx.CENTER, 5)self.panel.SetSizer(main_sizer)def on_file_pick(self, event):# 获取选择的文件路径self.image_path = event.GetPath()self.status_bar.SetStatusText(f'Selected file: {self.image_path}')def on_transform(self, event):# 获取选择的效果effect = self.effect_choice.GetStringSelection()# 应用所选效果if effect == 'Oil Painting':result = self.apply_oil_painting_effect()elif effect == 'Watercolor':result = self.apply_watercolor_effect()elif effect == 'Sketch':result = self.apply_sketch_effect()elif effect == 'Cartoon':result = self.apply_cartoon_effect()elif effect == 'Dreamy':result = self.apply_dreamy_effect()else:self.status_bar.SetStatusText('Please select an effect')return# 获取原始文件名和扩展名filename, ext = os.path.splitext(self.image_path)# 拼接输出文件名output_path = f'{filename}_{effect}{ext}'# 保存结果cv2.imwrite(output_path, result)# 打开转换后的图片os.startfile(output_path)# def apply_oil_painting_effect(self, brush_radius=6, intensity=1):#     # 加载图像#     image = cv2.imread(self.image_path)#     # 应用油画效果#     oil_painting = cv2.xphoto.createOilPaintingFilter(brush_radius, intensity)#     result = oil_painting.apply(image)#     return resultdef apply_oil_painting_effect(self, brush_radius=6, intensity=1):# 加载图像image = cv2.imread(self.image_path)# 转换为灰度图像gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用中值模糊gray = cv2.medianBlur(gray, brush_radius + 1)# 增强对比度gray = cv2.addWeighted(gray, 2.5, cv2.GaussianBlur(gray, (0, 0), brush_radius / 30), -0.5, 0)# 将灰度图像转换为彩色图像result = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)return result   def apply_watercolor_effect(self, sigma_s=60, sigma_r=0.4):# 加载图像image = cv2.imread(self.image_path)# 应用水彩效果watercolor = cv2.stylization(image, sigma_s=sigma_s, sigma_r=sigma_r)result = cv2.cvtColor(watercolor, cv2.COLOR_BGR2RGB)return resultdef apply_sketch_effect(self):# 加载图像image = cv2.imread(self.image_path)# 将图像转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 将灰度图像转换为边缘图像edges = cv2.Canny(gray_image, 30, 100)# 将边缘图像转换为彩色图像sketch = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)return sketchdef apply_cartoon_effect(self):# 加载图像image = cv2.imread(self.image_path)# 将图像转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用均值迁移滤波器以平滑图像filtered = cv2.pyrMeanShiftFiltering(image, 20, 50)#将平滑图像转换为灰度图像gray_filtered = cv2.cvtColor(filtered, cv2.COLOR_BGR2GRAY)# 应用边缘检测edges = cv2.adaptiveThreshold(gray_filtered, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 5)# 应用双边滤波器以增强边缘colored_edges = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)cartoon = cv2.bitwise_and(filtered, colored_edges)return cartoondef apply_dreamy_effect(self, blend_alpha=0.5):# 加载图像image = cv2.imread(self.image_path)# 将图像转换为浮点数格式image = image.astype(float) / 255.0# 应用高斯模糊以减少噪声blurred = cv2.GaussianBlur(image, (7, 7), 0)# 将图像与模糊图像混合dreamy = cv2.addWeighted(image, 1 - blend_alpha, blurred, blend_alpha, 0)return dreamyif __name__ == '__main__':app = wx.App()transformer = ImageTransformer()app.MainLoop()

这是一个Python类中的几个方法,用于应用不同的图像效果。每个方法都需要一个指向图像文件的路径作为输入,并返回处理后的图像。

  1. apply_oil_painting_effect方法:该方法使用OpenCV库将输入图像转换为灰度图像,然后应用中值模糊和增强对比度的技术,最后将灰度图像转换为彩色图像,并返回结果。

  2. apply_watercolor_effect方法:该方法使用OpenCV库实现水彩效果,通过调节参数sigma_ssigma_r来控制效果的强度,并将结果转换为RGB格式并返回。

  3. apply_sketch_effect方法:该方法将输入图像转换为灰度图像,然后使用Canny算法将其转换为边缘图像,最后将边缘图像转换为彩色图像并返回。

  4. apply_cartoon_effect方法:该方法将输入图像转换为灰度图像,然后通过应用均值迁移滤波器以平滑图像,并使用自适应阈值进行边缘检测,最后使用双边滤波器增强边缘并返回结果。

  5. apply_dreamy_effect方法:该方法将输入图像转换为浮点数格式,然后使用高斯模糊以减少噪声,并将图像与模糊图像混合,最后返回结果。混合系数由参数blend_alpha控制。

到此,我们的程序就完成了。您可以将上述代码保存到一个名为photoconvert5type.py的文件中,并运行它来测试程序。当程序运行时,您可以使用GUI界面中的打开按钮来选择一个图像文件,然后选择一个效果类型,最后点击处理按钮。程序将会创建一个新的文件,保存处理后的图像,并打开它。

 

 总结

本篇博客介绍了如何使用wxPython模块和OpenCV库来实现对图像进行灰度化、二值化、伽马校正、色彩空间转换和图像反转这5种效果的合并程序。程序可以通过wxPython提供的GUI界面来选择图片路径和效果类型,程序会将处理后的图像保存到指定路径并打开。如果您对这个程序感兴趣,可以尝试添加一些额外的效果,例如边缘检测或图像平滑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/58537.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探析STM32标准库与HAL库之间的差异与优劣

引言: 在嵌入式开发领域,STMicroelectronics的STM32系列芯片广受欢迎。STM32提供了两种主要的软件库,即标准库和HAL库,用于开发各种应用。本文将探讨这两种库之间的差异,比较它们的优劣,并分析在选择库时需…

运行 Jmeter 文件生成 HTML 测试报告,我选择 ANT 工具

概述 ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。 在与 Jmeter 生成的 jmx 文件配合使用中,ant 会完成jmx计划的执行和生成jtl文件,并将jtl文件转化为html页面进行查看。 还可…

容器安全的常见风险与防护实践

运行在云平台上的容器产品,因为具备一个完整的可移植应用程序环境,能够帮助用户轻松地完成对应用程序的开关控制,提升应用程序的敏捷性,同时节约企业的IT建设成本。在巨大优势作用下,容器产品的采用率在2021年达到了新…

在Ruoyi中采用Ajax动态生成Echarts图表实践

前言 在之前博文中,我们讲解了如何使用java在后台进行Echarts的图表生成组件,博文如下: 序号 博客连接1一款基于JAVA开发的Echarts后台生成框架2Ruoyi单体项目与Echarts4.2.1地图集成时的思路及解决办法3解决Ruoyi单体版本集成Echarts多图表时…

网络安全渗透测试之靶场训练

NWES: 7月26号武汉地震检测中心遭受境外具有政府背景的黑客组织和不法分子的网络攻击。 目前网络攻击主要来自以下几种方式: DDOS:分布式拒绝服务攻击。通过制造大量无用的请求向目标服务器发起访问,使其因短时间内无法处理大量请求而陷入瘫痪。主要针对…

Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)

1.简介 上一篇中已经教你把JMeter的测试环境搭建起来了,那么这一篇我们就将JMeter启动起来,一睹其芳容,首先宏哥给大家介绍一下如何来创建一个测试计划(Test Plan)。 2.创建一个测试计划(Test Plan&#x…

HarmonyOS元服务开发实践:桌面卡片字典

一、项目说明 1.DEMO创意为卡片字典。 2.不同卡片显示不同内容:微卡、小卡、中卡、大卡,根据不同卡片特征显示同一个字的不同内容,基于用户习惯可选择喜欢的卡片。 3.万能卡片刷新:用户点击卡片刷新按钮查看新内容,同时…

HTML 元素的 class 和 id 属性有何区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 唯一性⭐ 选择器权重⭐ JS操作⭐ CSS和JavaScript引用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏…

24届近5年上海交通大学自动化考研院校分析

今天给大家带来的是上海交通大学控制考研分析 满满干货~还不快快点赞收藏 一、上海交通大学 学校简介 上海交通大学是我国历史最悠久、享誉海内外的高等学府之一,是教育部直属并与上海市共建的全国重点大学。经过120多年的不懈努力,上海交…

Vue 整合 Element UI 、路由嵌套、参数传递、重定向、404和路由钩子(五)

一、整合 Element UI 1.1 工程初始化 使用管理员的模式进入 cmd 的命令行模式,创建一个名为 hello-vue 的工程,命令为: # 1、目录切换 cd F:\idea_home\vue# 2、项目的初始化,记得一路的 no vue init webpack hello-vue 1.2 安装…

spring-boot webservice的例子

webservice发布服务 源码下载地址 spring-boot-webservice例子资源-CSDN文库 webservice cilent调用 源码下载地址 spring-boot-clintwebservice调用服务的例子资源-CSDN文库

FFmpeg 使用总结

FFmpeg 简介 FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。包括如下几个部分&#xf…