图像变换(python)

前言

这个Python没学过,写的是真的不方便,有很多问题还没解决,暂时不想写了,感兴趣的同学可以完善一下。设计的思路就是摆几个控件然后将对应的函数实现,这个Python的坐标放置以及控件的大小我没弄懂,算出来不对劲,完全是按照自己的电脑摆的,然后窗口放置是和自己电脑成比例而且居中放置,本来还想把学过的图像处理全部封装到一个程序里面,结果还是卡在了一个地方,这个图片的显示是相对于之前图片的宽高成比例,所以还是看你太大或者太小展示,然后这个窗口焦点获取还没调整好,每次都要把图片窗口关闭才能选择新的图片转换。

灰度变换(python)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/136698756?spm=1001.2014.3001.5501

代码

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
from tkinter import ttk
import cv2
import numpy as np# 定义界面的框架
def Frame():# 创建窗口window = tk.Tk()window.title('图像处理')# 获取屏幕大小screen_width = window.winfo_screenwidth()screen_height = window.winfo_screenheight()# 计算所需窗口的相对大小relative_width = int(screen_width * 0.7)relative_height = int(screen_height * 0.7)# 打印宽和高print(relative_width, relative_height)# 计算窗口位于屏幕中央的坐标x = (screen_width - relative_width) // 2y = (screen_height - relative_height) // 2# 设置窗口大小(用f{}格式化字符串)window.geometry(f"{relative_width}x{relative_height}+{x}+{y}")# 生成界面需要的框架module(window)# 运行窗口window.mainloop()# 定义界面展示的组件
def module(window):# 声明全局变量img,comboglobal imgglobal combo# 在窗口中添加标签ystp = tk.Label(window, text="原始图片:", font=("楷体", 45), width=20, height=2)# 文本靠左对齐ystp.place(x=0, y=0)# 定义按钮button = tk.Button(window, text="打开文件", command=open_file, font=("楷体", 30), width=15, height=2)button.place(x=650, y=10)# 创建标签,用于显示图片img = tk.Label(window)img.place(x=387, y=150)# 创建下拉框combo = ttk.Combobox(window, font=("楷体", 25))combo["values"] = ("灰度反转", "对数变换", "伽马变换")combo.place(x=100, y=500)# 默认选中第一个选项combo.current(0)# 定义按钮button = tk.Button(window, text="开始转换", command=transition, font=("楷体", 30), width=15, height=2)button.place(x=650, y=450)# 文件打开
def open_file():# 声明全局变量photoglobal photo, file_path# 打开文件对话框,让用户选择图片文件(限定可以打开的文件格式)file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.jpeg;*.png;*.gif")])if file_path:print("选择的文件路径为:", file_path)# 加载并显示图片image = Image.open(file_path)# 调整图片的大小image = image.resize((300, 300))photo = ImageTk.PhotoImage(image)# 创建标签,显示图片img.config(image=photo)else:print("文件未找到或打开失败")# 图片转换
def transition():print("开始转换")# 读取当前下拉框的选项# print(combo.get())# opencv读取图像image = cv2.imread(file_path, 1)# 检查图像是否成功加载if image is not None:# 将图像灰度化灰度化# gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)option = combo.get()# 显示图像# 尺寸缩小一半image = cv2.resize(image, None, fx=0.3, fy=0.3)cv2.imshow('Original Image', image)# cv2.imshow('Gray', gray)if (option == "灰度反转"):# 灰度反转inverted_image = gray_inversion(image)# 尺寸缩小一半# inverted_image = cv2.resize(inverted_image, None, fx=0.5, fy=0.5)cv2.imshow('Inverted Image', inverted_image)elif (option == "对数变换"):# 对数变换transformed_image = log_transform(image, 20)# 尺寸缩小一半# transformed_image = cv2.resize(transformed_image, None, fx=0.5, fy=0.5)cv2.imshow('Log Transformed Image', transformed_image)elif (option == "伽马变换"):# 伽马变换corrected_image = gamma_correction(image, 10, 255)# 尺寸缩小一半# corrected_image = cv2.resize(corrected_image, None, fx=0.5, fy=0.5)cv2.imshow('Gamma Corrected Image', corrected_image)# 窗口保持cv2.waitKey(0)else:print("Failed to load image.")# 灰度反转 s=L-1-r
def gray_inversion(image):# 最大图像的灰度值减去原图像inverted_image = 255 - imagereturn inverted_image# 对数变换 s=c*log(1+r)
def log_transform(image, c=1):# 对图像进行对数变换transformed_image = c * np.log1p(image)# 将结果缩放到0~255transformed_image = np.uint8(transformed_image)return transformed_image# 伽马变换 s=c*r^y
def gamma_correction(image, gamma=1.0, c=1.0):# 将图像转换为浮点类型image = image.astype(np.float32) / 255.0# 应用伽马变换corrected_image = c * np.power(image, gamma)# 将结果缩放到0~255之间corrected_image = np.uint8(corrected_image)return corrected_imageif __name__ == '__main__':# 生成初始界面Frame()

目前又增加了直方图的均衡化,但是目前只能输出灰度图。

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
from tkinter import ttk
import cv2
import numpy as np# 定义界面的框架
def Frame():# 创建窗口window = tk.Tk()window.title('图像处理')# 获取屏幕大小screen_width = window.winfo_screenwidth()screen_height = window.winfo_screenheight()# 计算所需窗口的相对大小relative_width = int(screen_width * 0.7)relative_height = int(screen_height * 0.7)# 打印宽和高print(relative_width, relative_height)# 计算窗口位于屏幕中央的坐标x = (screen_width - relative_width) // 2y = (screen_height - relative_height) // 2# 设置窗口大小(用f{}格式化字符串)window.geometry(f"{relative_width}x{relative_height}+{x}+{y}")# 生成界面需要的框架module(window)# 运行窗口window.mainloop()# 定义界面展示的组件
def module(window):# 声明全局变量img,comboglobal combo, img# 在窗口中添加标签ystp = tk.Label(window, text="原始图片:", font=("楷体", 45), width=20, height=2)# 文本靠左对齐ystp.place(x=0, y=0)# 定义按钮button = tk.Button(window, text="打开文件", command=open_file, font=("楷体", 30), width=15, height=2)button.place(x=650, y=10)# 创建标签,用于显示图片img = tk.Label(window)img.place(x=387, y=150)# 创建下拉框combo = ttk.Combobox(window, font=("楷体", 25))combo["values"] = ("灰度反转", "对数变换", "伽马变换", "直方图均衡化")combo.place(x=100, y=500)# 默认选中第一个选项combo.current(0)# 定义按钮button = tk.Button(window, text="开始转换", command=transition, font=("楷体", 30), width=15, height=2)button.place(x=650, y=450)# 文件打开
def open_file():# 声明全局变量photoglobal photo, file_path# 打开文件对话框,让用户选择图片文件(限定可以打开的文件格式)file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.jpeg;*.png;*.gif")])if file_path:print("选择的文件路径为:", file_path)# 加载并显示图片image = Image.open(file_path)# 调整图片的大小image = image.resize((300, 300))photo = ImageTk.PhotoImage(image)# 创建标签,显示图片img.config(image=photo)else:print("文件未找到或打开失败")# 图片转换
def transition():print("开始转换")# 读取当前下拉框的选项# print(combo.get())# opencv读取图像image = cv2.imread(file_path, 0)# 检查图像是否成功加载if image is not None:# 将图像灰度化灰度化# gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)option = combo.get()# 显示图像# 尺寸缩小一半image = cv2.resize(image, None, fx=0.3, fy=0.3)cv2.imshow('Original Image', image)# cv2.imshow('Gray', gray)if (option == "灰度反转"):# 灰度反转inverted_image = gray_inversion(image)# 尺寸缩小一半# inverted_image = cv2.resize(inverted_image, None, fx=0.5, fy=0.5)cv2.imshow('Inverted Image', inverted_image)elif (option == "对数变换"):# 对数变换transformed_image = log_transform(image, 20)# 尺寸缩小一半# transformed_image = cv2.resize(transformed_image, None, fx=0.5, fy=0.5)cv2.imshow('Log Transformed Image', transformed_image)elif (option == "伽马变换"):# 伽马变换corrected_image = gamma_correction(image, 10, 255)# 尺寸缩小一半# corrected_image = cv2.resize(corrected_image, None, fx=0.5, fy=0.5)cv2.imshow('Gamma Corrected Image', corrected_image)elif (option == "直方图均衡化"):equal_image = equalizehist(image)cv2.imshow('equalizehist', equal_image)# 窗口保持cv2.waitKey(0)else:print("Failed to load image.")# 灰度反转 s=L-1-r
def gray_inversion(image):# 最大图像的灰度值减去原图像inverted_image = 255 - imagereturn inverted_image# 对数变换 s=c*log(1+r)
def log_transform(image, c=1):# 对图像进行对数变换transformed_image = c * np.log1p(image)# 将结果缩放到0~255transformed_image = np.uint8(transformed_image)return transformed_image# 伽马变换 s=c*r^y
def gamma_correction(image, gamma=1.0, c=1.0):# 将图像转换为浮点类型image = image.astype(np.float32) / 255.0# 应用伽马变换corrected_image = c * np.power(image, gamma)# 将结果缩放到0~255之间corrected_image = np.uint8(corrected_image)return corrected_image# 直方图均衡化
def equalizehist(image, L=256):# 计算直方图均衡前后的直方图hist_color = cv2.equalizeHist(image)return hist_color# 分割RGB图像
# def equalize_hist_color(image):
#     # 使用cv2.split()分割RGB图像
#     channels = cv2.split(image)
#     eq_channels = []
#     # 将cv2.equalizeHist()函数应用与每个通道
#     for ch in channels:
#         eq_channels.append(cv2.equalizeHist(ch))
#     # 使用cv2.merge()合并结果通道
#     eq_image = cv2.merge(eq_channels)
#     return eq_imageif __name__ == '__main__':# 生成初始界面Frame()

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

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

相关文章

3月份的倒数第二个周末有感

坐在图书馆的那一刻,忽然感觉时间的节奏开始放缓。今天周末因为我们两都有任务需要完成,所以就选了嘉定图书馆,不得不说嘉定新城远香湖附近的图书馆真的很有感觉。然我不经意回想起学校的时光,那是多么美好且短暂的时光。凝视着窗…

如何进行Modbus转Profinet网关的调试与故障排除

Modbus转Profinet网关(XD-MDPN100)带有网口和串口很大限度地解决了设备接口不统一的问题,支持485和232,可以实现从Modbus通信协议到Profinet通信协议的无缝转换,为不同协议之间的互联互通提供了便利。 Modbus转Profine…

时间戳的转换-unix时间戳转换为utc时间(python实现)

import datetimetimestamp = 1711358882# 将时间戳转换为UTC时间 utc_time = datetime.datetime.utcfromtimestamp(timestamp)# 格式化并输出时间 formatted_time = utc_time.strftime(%Y-%m-%d %H:%M:%S) print(formatted_time)同样:UTC如何转换为unix时间戳 from datetime …

Axure案例分享—折叠面板(附下载地址)

今天和大家分享的Axure案例是折叠面板 折叠面板是移动端APP中常见的组件之一,有时候也称之为手风琴。咱们先看下Axure画出的折叠面板原型效果,然后再对该组件进行详细讲解。 一、功能介绍 折叠或展开多个面板内容,默认为展开一项内容&…

K8s-网络原理-中篇

引言 本文是《深入剖析 K8s》的学习笔记,相关图片和案例可从https://github.com/WeiXiao-Hyy/k8s_example中获取,欢迎 ⭐️! 上篇主要介绍了 Flannel 插件为例,讲解了 K8s 里容器网络和 CNI 插件的主要工作原理。还有一种“纯三层”的网络方…

C语言程序与设计——预处理命令

宏 在C语言中宏有三种形式: 定义符号常量定义傻瓜表达式定义代码段 在使用宏的过程中需要注意的是,宏的作用仅仅是在预处理阶段对代码进行替换,而非进行运算,所以在使用时,如果出现了我们预期之外的结果,很有可能是宏…

Java代码基础算法练习-搬砖问题-2024.03.25

任务描述: m块砖,n人搬,男搬4,女搬3,两个小孩抬一砖,要求一次全搬完,问男、 女、小孩各若干? 任务要求: 代码示例: package M0317_0331;import java.util.S…

【Android】图解View事件分发机制

文章目录 View事件分发机制dispartchTouchEvent()dispatchTouchEvent() 方法主要负责什么? onTouchEvent(event) 点击事件分发的传递规则自上而下自下而上 View事件分发机制 View的事件分发机制是Android中非常核心的一个概念,它负责处理触摸事件&#…

SpringMVC | Spring MVC中的“拦截器”

目录: 一、拦截器 :1. 拦截器的 “概述”2. 拦截器的 “定义” (创建“拦截器”对象)3. 拦截器的 “配置” (让“拦截器”对象生效)4. 拦截器的 “执行流程”“单个拦截器”的执行流程“多个拦截器”的执行流程 二、应用案例一实现用户登录权限验证 作者简介 &#…

nav仿真(2)

开启仿真和建图 打开第一个窗口启动仿真: source devel/setup.bash export TURTLEBOT3_MODELburger roslaunch turtlebot3_gazebo turtlebot3_world.launch # 启动仿真打开第二个窗口,开始建图: source devel/setup.bash export TURTLEBOT3_…

举4例说明Python如何使用正则表达式分割字符串

在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。 示例 1: 使用单个字符作为分隔符 假设你有一个由逗号分隔的字符串,你可…

Redis入门到实战-第三弹

Redis入门到实战 Redis数据类型官网地址Redis概述Redis数据类型介绍更新计划 Redis数据类型 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的(采用BSD许可证&#…

用大语言模型控制交通信号灯,有效缓解拥堵!

城市交通拥堵是一个全球性的问题,在众多缓解交通拥堵的策略中,提高路口交通信号控制的效率至关重要。传统的基于规则的交通信号控制(TSC)方法,由于其静态的、基于规则的算法,无法完全适应城市交通不断变化的…

Unity 学习日记 8.2D物理引擎

1.2D刚体的属性和方法 2.碰撞器

MySQL -- 开窗函数 row_number 之 先根据名字分组,然后再根据分数排序

目录 开窗函数 row_number需求: 先根据名字分组,然后再根据分数排序 开窗函数 row_number 需求: 先根据名字分组,然后再根据分数排序 sql写法及解释: 可以再加子查询进行条件判断 函数用法解释:

登录注册界面

T1、编程设计理工超市功能菜单并完成注册和登录功能的实现。 显示完菜单后&#xff0c;提示用户输入菜单项序号。当用户输入<注册>和<登录>菜单序号时模拟完成注册和登录功能&#xff0c;最后提示注册/登录成功并显示注册信息/欢迎XXX登录。当用户输入其他菜…

Redis - 高并发场景下的Redis最佳实践_翻过6座大山

文章目录 概述6座大山之_缓存雪崩 &#xff08;缓存全部失效&#xff09;缓存雪崩的两种常见场景如何应对缓存雪崩&#xff1f; 6座大山之_缓存穿透&#xff08;查询不存在的 key&#xff09;缓存穿透的原因解决方案1. 数据校验2. 缓存空值3. 频控4. 使用布隆过滤器 6座大山之_…

K8s的Pod出现Init:ImagePullBackOff问题的解决,(以calico网络插件为例)

问题描述&#xff1a; 对于这类问题的解决思路应该都差不多&#xff0c;本文以calico插件安装为例&#xff0c;发现有个Pod的镜像没有pull成功 第一步&#xff1a;查看这个pod的描述信息 kubectl describe pod calico-node-t9rql -n kube-system从上图发现是docker拉取"…

H3C技术大全复现之高级路由交换技术 1

华子目录 VLAN 基本技术VLANIEEE 802.1Q交换机端口类型MVRP协议实验测试 VLAN扩展技术Super VLAN产生背景Super vlan&#xff08;相当于vlanif接口&#xff0c;也属于虚拟接口&#xff0c;可以充当网关&#xff09;Sub vlan&#xff08;普通vlan&#xff09;关于代理ARP普通代理…

了解和使用无操作系统和平台驱动程序

快速发展的技术需要软件支持&#xff08;固件驱动程序和示例代码&#xff09;来简化设计过程。本文介绍了如何使用 no-OS&#xff08;无操作系统&#xff09;驱动程序和平台驱动程序来构建具有 Analog Devices 模数转换器和数模转换器的应用固件&#xff0c;这些转换器在以下方…