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.rhkb.cn/news/81328.html

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

相关文章

2021年12月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 昨天的温度是5摄氏度,今天降温7摄氏度,今天的温度是多少摄氏度? A:12 B:7 C:2 D:-2 正确的答案是 D:-2。 解析: 根据题目描述,昨天的温度是 5 摄氏度,今天降温了 7 摄氏度。降温意味着温度变低,所以今天的温度…

k8s之Pod控制器

目录 一、Pod控制器及其功用二、pod控制器的多种类型2.1 pod容器中的有状态和无状态的区别 三、Deployment 控制器四、SatefulSet 控制器4.1 StatefulSet由以下几个部分组成4.2 为什么要有headless?4.3 为什么要有volumeClaimTemplate?4.4 滚动更新4.5 扩…

解决MAC M1处理器运行Android protoc时出现的错误

Protobuf是Google开发的一种新的结构化数据存储格式,一般用于结构化数据的序列化,也就是我们常说的数据序列化。这个序列化协议非常轻量级和高效,并且是跨平台的。目前,它支持多种主流语言,比传统的XML、JSON等方法更具…

性能优化必知必会

系统性能调优 分为四个层次 基础设施网络编解码分布式系统性能整体提升 一:基础设施优化 从提升单机进程的性能入手,包括高效的使用主机的CPU、内存、磁盘等硬件,通过提高并发编程提升吞吐量,根据业务特性选择合适的算法 01 …

CSS—选择器

目录 一、CSS简介 二、HTML页面中常用的元素 三、CSS语法规则 四、常用的选择器 五、选择器参考 一、CSS简介 CSS (Cascading Style Sheets,层叠样式表),是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式…

如何把非1024的采样数放入aac编码器

一. aac对数据规格要求 二、代码实现 1.初始化 2.填入数据 3.取数据 三.图解 一. aac对放入的采样数要求 我们知道aac每次接受的字节数是固定的,在之前的文章里有介绍libfdk_aac音频采样数和编码字节数注意 它支持的采样数和编码字节数分别是: fdk_aac …

Go context.WithCancel()的使用

WithCancel可以将一个Context包装为cancelCtx,并提供一个取消函数,调用这个取消函数,可以Cancel对应的Context Go语言context包-cancelCtx 疑问 context.WithCancel()取消机制的理解 父母5s钟后出门,倒计时,父母在时要学习,父母一走就可以玩 …

【mock安装时报错】

node版本需要大于16 切换>16的版本即可 建议使用 nvm进行 node版本状态管理 可参考另一篇文章 nvm多版本管理方案

windows美化任务栏,不使用软件

1.任务栏透明: 效果图: (1).winr打开命令行 输入regedit回车打开注册表 regedit (2).在注册表中打开 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced 这个路径 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explore…

爬虫获取电影数据----以沈腾参演电影为例

数据可视化&分析实战 1.1 沈腾参演电影数据获取 文章目录 数据可视化&分析实战前言1. 网页分析2. 构建数据获取函数2.1 网页数据获取函数2.2 网页照片获取函数 3. 获取参演影视作品基本数据4. 电影详细数据获取4.1 导演、演员、描述、类型、投票人数、评分信息、电影海…

【51单片机】晨启科技,7针OLED显示驱动程序,STC89C52RC

文章目录 原理图oled.coled.hmain.c 原理图 sbit OLED_SCLP4^3;//SCL-D0 sbit OLED_SDAP4^1;//SDA-D1 sbit OLED_RES P3^6;//RES sbit OLED_DC P3^7;//DC sbit OLED_CSP2^7; //CS oled.c #include "OLED.h"//******************************说明*******************…

Redis 高频数据类型使用详解

目录 一、前言 二、Redis常用数据类型 2.1 常见的数据类型 三、String 类型 3.1 String 类型简介 3.2 String常用操作命令 3.2.1 String 操作命令实践 3.3 常用业务场景 3.3.1 session共享 3.3.2 登录失败计数器 3.3.3 限流 3.3.4 多线程安全控制 四、Hash类型 4…

android 如何分析应用的内存(十五)——Visual Studio Code 调试Android应用

android 如何分析应用的内存(十五)——Visual Studio Code 调试Android 应用 在上一篇文章介绍了jdb调试java应用 接下来介绍用UI界面调试java应用,达到同jdb一样的效果。 同样的UI界面有很多选择,如Eclipse,Android …

Redis 双写一致性实践及案例

面试问题: 你只要用缓存,就可能会涉及到redis缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?双写一致性,你先动缓存redis还是数据库mysql哪一个&…

Python识别抖音Tiktok、巨量引擎滑块验证码识别

由于最近比较忙,所以本周搞了一个相对简单的验证码,就是抖音Tiktok的滑块验证码,这也是接到客户的一个需求。这种验证码通常在电脑端登录抖音、巨量引擎的的时候出现。 首先看一下最终的效果: 验证码识别过程 1、利用爬虫采集图…

【Vue】使用print.js插件实现打印预览功能,超简单

目录 一、实现效果 二、实现步骤 【1】安装插件 【2】在需要打印的页面导入 【3】在vue文件中需要打印的部分外层套一层div,给div设置id。作为打印的区域 【4】在打印按钮上添加打印事件 【5】在methods中添加点击事件 三、完整代码 一、实现效果 二、实现步…

Spring集成Seata

Seata的集成方式有: 1. Seata-All 2. Seata-Spring-Boot-Starter 3. Spring-Cloud-Starter-Seata 本案例使用Seata-All演示: 第一步:下载Seata 第二步:为了更好看到效果,我们将Seata的数据存储改为db 将seata\sc…

《合成孔径雷达成像算法与实现》Figure3.2

代码参数说明:Sf1为书中公式3.19,Sf2为时域信号快速傅里叶表达式,两种频谱表达式所做出的图可看出其区别 代码如下: clc clear all close all%参数设置 TBP 720; %时间带宽积 T 10e-6; %脉冲持续时间%参数计…

kafka:java client使用总结塈seek() VS commitSync()的区别(三)

最近一段日子接触了kafka这个消息系统,主要为了我的开源中间件项目simplemq增加kafka支持(基于kafka-client【java】),如今总算完成,本文是对这个过程中对kafka消息系统的使用总结 线程安全 关于线程安全&#xff0c…

java中javamail发送带附件的邮件实现方法

java中javamail发送带附件的邮件实现方法 本文实例讲述了java中javamail发送带附件的邮件实现方法。分享给大家供大家参考。具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它…