Python面向对象,实现图片处理案例,支持:高斯模糊、Canny边缘检测、反转边缘图像、生成手绘效果、调亮度......等等

实验图片如下:
命名为img1.jpg, 放在项目下新建文件夹images下
在这里插入图片描述
项目构造如下:
在这里插入图片描述

app.py源码如下

import cv2
import os
from matplotlib import pyplot as plt
import numpy as npclass ImageProcessor:def __init__(self, image_path):self.image = cv2.imread(image_path)  # Load the imageif self.image is None:raise ValueError("Image not found or unable to load.")self.image = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)  # Convert to RGB formatself.gray_image = cv2.cvtColor(self.image, cv2.COLOR_RGB2GRAY)  # Convert to grayscaleself.blurred_image = Noneself.edges = Noneself.inverted_edges = Noneself.cartoon_image = Noneself.save_counter = 0def apply_gaussian_blur(self, ksize=(5, 5), sigmaX=0):self.blurred_image = cv2.GaussianBlur(self.gray_image, ksize, sigmaX)self.cartoon_image = self.blurred_image  # Assuming cartoon_image should be blurred initiallyself.save_counter += 1self.save_image(f'new{self.save_counter}.jpg')def detect_edges(self, threshold1=50, threshold2=150):self.apply_gaussian_blur()self.edges = cv2.Canny(self.blurred_image, threshold1, threshold2)self.cartoon_image = self.edges  # Assuming cartoon_image should show edges initiallyself.save_counter += 1self.save_image(f'new{self.save_counter}.jpg')def invert_edges(self):self.detect_edges()self.inverted_edges = cv2.bitwise_not(self.edges)self.cartoon_image = self.inverted_edges  # Assuming cartoon_image should show inverted edges initiallyself.save_counter += 1self.save_image(f'new{self.save_counter}.jpg')def create_cartoon_effect(self):self.invert_edges()# Create a cartoon effect by combining edges and original imagecolor_image = cv2.bilateralFilter(self.image, d=9, sigmaColor=75, sigmaSpace=75)self.cartoon_image = cv2.bitwise_and(color_image, color_image, mask=self.inverted_edges)self.save_counter += 1self.save_image(f'new{self.save_counter}.jpg')def save_image(self, filename):if self.cartoon_image is None or self.cartoon_image.size == 0:print("Cartoon image is empty, skipping save.")returnif not os.path.exists('../newImg'):os.makedirs('../newImg')cv2.imwrite(f'newImg/{filename}', cv2.cvtColor(self.cartoon_image, cv2.COLOR_RGB2BGR))print(f"图片已保存为 newImg/{filename}")def show_images(self):plt.rcParams['font.sans-serif'] = ['SimHei']  # 用黑体显示中文plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负号显示问题plt.figure(figsize=(10, 10))plt.subplot(1, 2, 1)plt.title("原图片")plt.imshow(self.image)plt.axis('off')plt.subplot(1, 2, 2)plt.title("处理后的图片")plt.imshow(self.cartoon_image)plt.axis('off')plt.show()def main():image_path = '../images/img1.jpg'  # 请确保路径正确processor = ImageProcessor(image_path)while True:print("\n请选择图片处理功能编号:")print("1 - 高斯模糊")print("2 - Canny边缘检测")print("3 - 反转边缘图像")print("4 - 生成手绘效果")print("5 - 显示图片")print("0 - 退出")choice = input("输入你的选择:")if choice == '1':processor.apply_gaussian_blur()print("高斯模糊已应用并保存。")elif choice == '2':processor.detect_edges()print("Canny边缘检测已应用并保存。")elif choice == '3':processor.invert_edges()print("边缘图像已反转并保存。")elif choice == '4':processor.create_cartoon_effect()print("手绘效果已生成并保存。")elif choice == '5':processor.show_images()elif choice == '0':print("退出程序。")breakelse:print("无效的输入,请重新输入。")if __name__ == "__main__":main()

终端运行效果:
在这里插入图片描述
生成手绘照片处理效果如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

利用LangChain与LLM打造个性化私有文档搜索系统

我们知道LLM(大语言模型)的底模是基于已经过期的公开数据训练出来的,对于新的知识或者私有化的数据LLM一般无法作答,此时LLM会出现“幻觉”。针对“幻觉”问题,一般的解决方案是采用RAG做检索增强。 但是我们不可能把…

C++ 基础语法 一

C 基础语法 一 文章目录 C 基础语法 一const 限定符常量指针类型别名autodecltypeQStringvector迭代器指针和数组显示转换static_castconst_cast 函数尽量使用常量引用数组形参不要返回局部对象的引用和指针返回数组指针 C四种转换内联函数constexpr函数函数指针 const 限定符 …

tensorflow案例4--人脸识别(损失函数选取,调用VGG16模型以及改进写法)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 这个模型结构算上之前的pytorch版本的,算是花了不少时间,但是效果一直没有达到理想情况,主要是验证集和训练集准确率…

力扣每日一题 超级饮料的最大强化能量 动态规划(dp)

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB,数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。 你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而,如果从一种能量饮料切换到…

全国产 V7 690T+FT6678 高性能实时信号处理平台设计原理

1、概述 全国产 V7 690TFT6678 高性能实时信号处理平台组成如图 1 所示,包含 1 片SMQ7VX690TFFG1761 和两片 FT-6678(国防科大)的 DSP,总共 3 个主芯片;每个主芯片外部各搭配 1 组 64bit 的 DDR3 内存模组以及各芯片启…

0.STM32F1移植到F0的各种经验总结

1.结构体的声明需放在函数的最前面 源代码: /*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructu…

Linux高阶——1027—守护进程

1、守护进程的基本流程 1、父进程创建子进程,父进程退出 守护进程是孤儿进程,但是是工程师人为创建的孤儿进程,低开销模式运行,对系统没有压力 2、子进程(守护进程)脱离控制终端,创建新会话 …

Selective Generation for Language Models 语言模型的选择性生成

生成式语言模型(Generative Language Models, GLMs)在文本生成任务中取得了显著进展。然而,生成内容的“幻觉”现象,即生成内容与事实或真实语义不符的问题,仍是GLMs在实际应用中的一个重大挑战。为了解决这一问题&…

-bash: ./my_rename.sh: /bin/bash^M: bad interpreter: No such file or directory

在windows上写了一个shell脚本,在Linux上执行时报错,然后看下解决办法: 查了下,其实就是windows系统里文件行尾的换行符和Linux不同引起的, sed -i s/\r$// my.sh用这行代码处理一下,就可以正常运行了。 执…

flutter区别于vue的写法

View.dart 页面渲染&#xff1a; 类似于vue里面使用 <template> <div> <span> <textarea>等标签绘制页面, flutter 里面则是使用不同的控件来绘制页面 样式 与传统vue不同的是 flutter里面没有css/scss样式表&#xff0c; Flutter的理念是万物皆…

idea免费安装步骤,(java集成开发环境)超详细

第一步 点击链接下载 百度网盘 请输入提取码 提取码是idea 下载步骤 可设也可不设置 我就没有设置 下一步 就点击安装就大功告成了

SAP RFC 用户安全授权

一、SAP 通讯用户 对于RFC接口的用户&#xff0c;使用五种用户类型之一的“通讯”类型&#xff0c;这种类型的用户没有登陆SAPGUI的权限。 二、对调用的RFC授权 在通讯用户内部&#xff0c;权限对象&#xff1a;S_RFC中&#xff0c;限制进一步可以调用的RFC函数授权&#xff…

大数据-201 数据挖掘 机器学习理论 - 决策树 局部最优 剪枝 分裂 二叉分裂

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

计算机网络-总线型以太网(ethernet)-知识点小结

广域网与局域网区分: 广域网: 广域网不使用局域网技术, 传输介质 主要是光纤和电话线 常见广域网技术 综合业务数字网&#xff08;ISDN&#xff09;、 帧中继&#xff08;Frame Relay&#xff09;、 异步传输模式 局域网: 以太网--ethernet 简介: 是一种总线型局域网技术&#…

透明加密技术是什么?透明加密技术的原理与应用实践(内含代表性软件分享)

触目惊心&#xff01;10大典型间谍案例回顾 张某离职前搜集大量文件资料&#xff0c;甚至拆开电脑主机拷贝文件 私自存有5200份文件资料 其中标注绝密级的59份 机密级848份 秘密级541份 在当今这个信息化高速发展的时代&#xff0c;透明加密技术已不容忽视。那么&#xff…

C/C++ 每日一练:二叉树的先序遍历

二叉树 binary tree 定义 二叉树是一种树状数据结构&#xff0c;非线性数据结构&#xff0c;代表“祖先”与“后代”之间的派生关系&#xff0c;体现了“一分为二”的分治逻辑。与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;二叉树的每个节点包含三个主要部分&am…

OpenCV开发笔记(八十二):两图拼接使用渐进色蒙版场景过渡缝隙

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/143432922 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

Unity程序化生成地形

制作地形&#xff1a; 绘制方块逐个绘制方块并加噪波高度删除Gizmos和逐个绘制 1.draw quad using System.Collections; using System.Collections.Generic; using UnityEngine;[RequireComponent(typeof(MeshFilter))] public class mesh_generator : MonoBehaviour {Mesh m…

基于MoviNet检测视频中危险暴力行为

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【Faster & Mask R-CNN模型实现啤酒瓶瑕疵检测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生…

Java项目实战II基于Java+Spring Boot+MySQL的桂林旅游景点导游平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 基于Java、…