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 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.mfbz.cn/a/65342.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java-对对象的拷贝、抽象类和接口的区别、Object类、对象的比较方法和内部类

目录 1.Clonable接口和深拷贝 2.抽象类和接口的区别 3.Object类 4.获取对象的信息 5.对象比较方法equals 6.内部类 1.Clonable接口和深拷贝 Java 中内置了一些很有用的接口, Clonable 就是其中之一,Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对…

jupyter lab build失败,提示需要安装版本>=12.0.0的nodejs但其实已从官网安装18.17.0版本 的解决方法

出现的问题如题目所示,这个问题差点要把我搞死了。。。但还是在没有重装的情况下解决了😘。 问题来源 初衷是想安装lsp扩展,直接在jupyter lab网页界面的extensions中搜索lsp并点击install krassowski/jupyterlab-lsp,会提示需要…

tomcat虚拟主机配置演示

一.新建用于显示的index.jsp文件,写入内容 二.修改tomcat/apache-tomcat-8.5.70/conf/server.xml配置文件 匹配到Host那部分,按上面格式在后面添加自己的域名和文件目录信息 主要是修改name和docBase 保存退出重启tomcat,确保tomcat运行…

QT笔记——QT自定义事件

我们有时候想发送自定义事件 1:创建自定义事件,首先我们需要知道它的条件 1:自定义事件需要继承QEvent 2:事件的类型需要在 QEvent::User 和 QEvent::MaxUser 范围之间,在QEvent::User之前 是预留给系统的事件 3&#…

python免费下载安装教程,python编程软件 免安装

本篇文章给大家谈谈python免费下载安装教程,以及python编程软件 免安装,希望对各位有所帮助,不要忘了收藏本站喔。 百度网盘 请输入提取码 提取码: wifx 下载好记得把python文件解压,里面有32位和64位的,根据自己配置…

【工作中问题解决实践 十】一次内存泄露排查-MAT使用指南

最近体验了一把当医生的感觉,定位病根病因,感觉这种要揪出问题的感觉很爽,并不觉得麻烦,这里将整个排查过程记录一下,方便之后再遇到类似问题有应对之道。 问题背景 2023-07-18 早上还在睡梦中的俺被一条条报警消息铛…

Spring事务管理

1.什么是事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么一起成功,要么一起失败,是一个不可分割的工作单元。 涉及到事务的场景非常多,一个 service 中往往需要调用不同的 dao 层方法,这些方法…

区块链技术助力慈善,为您的善举赋予全新力量!

我们怀揣着一颗温暖的心,秉承着公开透明的理念,带着信任与责任,倾力打造了一套区块链技术驱动的去中心化捐赠与物资分发系统,通过智能生态网络(IEN)解决捐赠不透明问题的系统,让您的善举直接温暖…

Linux命令200例:cd用于改变当前工作目录(常用)

🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…

【Rust】Rust学习 第五章使用结构体组织相关联的数据

5.1 定义结构体并实例化结构体 定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field&…

数据结构--最小生成树

数据结构–最小生成树 连通图 \color{red}连通图 连通图的生成树是 包含图中全部顶点的一个极小连通子图 \color{red}包含图中全部顶点的一个极小连通子图 包含图中全部顶点的一个极小连通子图。 若图中顶点数为n,则它的生成树含有 n-1 条边。对生成树而言&#xff…

断路器回路电阻试验

试验目的 断路器回路电阻主要取决于断路器动、 静触头的接触电阻, 其大小直接影响正常 运行时的发热情况及切断短路电流的性能, 是反应安装检修质量的重要数据。 试验设备 回路电阻测试仪 厂家: 湖北众拓高试代销 试验接线 对于单断口的断路器, 通过断口两端的接线…

WebRTC 之音视频同步

在网络视频会议中, 我们常会遇到音视频不同步的问题, 我们有一个专有名词 lip-sync 唇同步来描述这类问题,当我们看到人的嘴唇动作与听到的声音对不上的时候,不同步的问题就出现了 而在线会议中, 听见清晰的声音是优先…

redis 集群 2:分而治之 —— Codis

在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘。首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢复时也会消耗很长的数据加载…

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…

前沿分享-鱼形机器人

可能并不太前沿了,是21年底的新闻了,但是看见了就顺便发一下吧。 大概就是,通过在pH响应型水凝胶中编码不同的膨胀速率而构建了一种环境适应型变形微机器人,让微型机器人直接向癌细胞输送药物从而减轻药物带来副作用。 技术原理是&#xff0c…

【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"//******************************说明*******************…

APP外包开发的Flutter框架

Flutter 是一种流行的开源UI框架,由谷歌开发,用于构建跨平台的移动应用程序。它使用一套统一的代码库,可以在多个平台上(如Android、iOS、Web、桌面等)保持一致的外观和行为。今天和大家分享一些基于 Flutter 开发的常…

初次使用GPU云服务器

前言: 在体验了GPU云服务器(GPU Cloud Computing,GPU)后,我认为这是一个非常强大的弹性计算服务。它为深度学习、科学计算、图形可视化、视频处理等多种应用场景提供了强大的GPU算力,能够满足各类用户的计算…

如何使Python Docker镜像安全、快速、小巧

一、说明 在微服务领域,拥有安全、高效和紧凑的 Docker 映像对于成功部署至关重要。本博客将探讨有助于构建此类映像的关键因素,包括不以 root 用户身份运行映像的重要性、在构建映像时更新和升级包、在编写 Dockerfile 指令时考虑 Docker 的层架构&…
最新文章