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

news2024/11/24 14:50:39

本篇博客将介绍如何使用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 os

class ImageTransformer(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Image Transformer')
        self.panel = wx.Panel(self)
        self.image_path = None
        self.effect_choice = None
        self.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 os

class ImageTransformer(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Image Transformer')
        self.panel = wx.Panel(self)
        self.image_path = None
        self.effect_choice = None
        self.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 result
    def 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 result

    def 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 sketch

    def 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 cartoon

    def 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 dreamy

if __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.coloradmin.cn/o/848740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

W5500-EVB-PICO作为TCP Client 进行数据回环测试(五)

前言 上一章我们用W5500-EVB-PICO开发板通过DNS解析www.baidu.com(百度域名)成功得到其IP地址,那么本章我们将用我们的开发板作为客户端去连接服务器,并做数据回环测试:收到服务器发送的数据,并回传给服务器…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(37)-掌握Fiddler中Fiddler Script用法你有多牛逼-下

1.简介 Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大的帮助。Fiddler提供的功能基本上能…

在线高精地图生成算法调研

1.HDMapNet 整体的网络架构如图所示,最终的Decoder输出三个分支,一个语义分割,一个embedding嵌入分支,一个方向预测。然后通过后处理将这些信息处理成向量化的道路表示。 img2bev的方式之前有IPM,通过假设地面的高度都…

模仿火星科技 基于cesium+水平面积测量+可编辑

​ 当您进入Cesium的编辑水平积测量世界,下面是一个详细的操作过程,帮助您顺利使用这些功能: 1. 创建提示窗: 启动Cesium应用,地图场景将打开,欢迎您进入编辑模式。 在屏幕的一角,一个友好的提…

Linux6.34 Kubernetes yaml文件详解

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes yaml文件详解一、yaml文件概述1.查看 api 资源版本标签2.写一个yaml文件demo 计算机系统 5G云计算 第三章 LINUX Kubernetes yaml文件详解 一、yaml文件概述 Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式…

ArcGIS Pro基础:【划分】工具实现等比例、等面积、等宽度划分图形操作

本次介绍【划分】工具的使用,如下所示,为该工具所处位置。使用该工具可以实现对某个图斑的等比例面积划分、相等面积划分和相等宽度划分。 【等比例面积】:其操作如下所示,其中: 1表示先选中待处理的图斑,2…

利用GPT打造你的博客|论文的专属讲解员→强制让GPT学习你的知识?(不需要魔法)

文章目录 1 前言2 搭建我的博客问答系统2.1 平台介绍(不需要魔法即可访问)2.2 前期准备2.3 上传博客作为数据集至Dify2.4 搭建你的博客回答专员 3 利用有针对性的GPT帮助我们阅读前沿论文4 结语 个人博客专属问答员:demo 1 前言 GPT是生成式…

React入门学习笔记3

事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——为了更好的兼容性 eg:οnclick》onClickReact中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——为了更高效通过event.target得到发生…

Go context.WithCancel()的使用

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

视频怎么改成gif格式?简单几步就可以轻松视频转gif

平时我们使用的许多gif图片,其实都是视频片段,那么是怎么把视频转gif格式的呢?可以使用视频转gif工具来完成gif制作,下面就给大家分享一个简单的视频转gif在线制作(https://www.gif.cn)的方法,一…

pycharm离线安装依赖包

一、对于单个下载离线包,然后安装 1、先去https://pypi.org/网站下载离线包,下载到本地; 2、从磁盘中找到刚刚下载包,点击确定就可以安装了 二、将本地项目所有依赖包全部下载下来,然后批量在另一个项目&#xff…

Linux抓包工具----tcpdump

这是一个目录 一、什么是tcpdump二、为什么要用tcpdump三、tcpdump在哪里?四、怎么用tcpdump?4.1 命令格式4.2 常用选项4.2.1 对网络接口抓包 -i4.2.2 指定收取数据包的数量 -c4.2.3 不把ip转换成域名,直接显示ip -n4.2.4 显示ip和端口号 -nn…

权限校验—接口检验

一、背景介绍 最近项目中要实现根据不同用户去划分不同的角色,而不同角色具备调用不同接口的权限这个功能。用户在调用接口时需要校验用户是否具有权限访问接口,防止外界恶意调用随意篡改 二、思路&方案 为什么要进行接口鉴权? 接口鉴权…

几种常见的光纤接头有哪些?

名称: 光纤接头 光纤接头(optical fiber splice),将两根光纤永久地或可分离开地联结在一起,并有保护部件的接续部分,光纤接头是光纤的末端装置问题描述: 几种常见的光纤接头有哪些? 回答: 1.常见的光纤接头 LC 、SC 、FC 、ST、 MPO LC (Lucent connector) 小…

MySQL 事务原理:锁机制

文章目录 一、锁类型1.1 全局锁1.2 表级锁1.2.1 表锁1.2.2 元数据锁1.2.3 意向锁1.2.4 自增锁 1.3 行级锁1.3.1 记录锁1.3.2 间隙锁1.3.3 临键锁1.3.4 插入意向锁 1.4 锁的兼容性 二、锁的CUDP2.1 查询2.2 删除、更新2.3 插入 三、锁的对象四、并发死锁4.1 相反加锁顺序导致死锁…

监控Kafka的关键指标

Kafka 架构 上面绿色部分 PRODUCER(生产者)和下面紫色部分 CONSUMER(消费者)是业务程序,通常由研发人员埋点解决监控问题,如果是 Java 客户端也会暴露 JMX 指标。组件运维监控层面着重关注蓝色部分的 BROKE…

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…

【C++笔记】C++启航之为C语言填坑的语法

【C笔记】C启航之为C语言填坑的语法 一、命名空间1、为什么要引入命名空间?2、命名空间的基本用法3、展开命名空间4、命名空间的套娃5、命名空间的自动合并 二、缺省参数1、为什么要引入缺省参数?2、缺省参数的基本用法3、缺省的参数必须从右向左4、缺省…

为什么我们需要加快推进数字孪生技术?

数字孪生技术以其强大的潜力和应用前景,引起了各行各业的广泛关注和热切期待。那么,究竟为什么要加快推进数字孪生技术呢? 首先,数字孪生技术能够实现现实世界与虚拟世界的无缝连接,为各行业带来了前所未有的创新机遇…

Vue电商项目--VUE插件的使用及原理

图片懒加载 图片懒加载,就是图片延迟加载。只加载页面可视区域上的图片,等滚动到页面下面时,再加载对应视口上的图片 而在vue中有一个插件 vue-lazyload - npm (npmjs.com) npm i vue-lazyload 去使用他,这里我们引入了一张图片…