图像变换(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.mzph.cn/news/771757.shtml

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

相关文章

如何统计代码量

工具: cloc 下载地址: Releases AlDanial/cloc GitHub 使用方法:

武汉星起航:跨境电商行业的领军者,互帮互助共创佳绩

武汉星起航电子商务有限公司,作为跨境电商行业的领军者,以其出色的业绩和卓越的团队实力,在业内赢得了广泛的赞誉。公司自运营团队在亚马逊平台上成功开设了多家店铺,凭借着深耕跨境电商行业多年所积累的经验,取得了令…

使用mybatis-plus添加数据报错

1、报错问题 2、错误分析 无法配置数据库实体类的属性id,类型不匹配 3、解决分析 (1)数据库类型不匹配,先查看数据库数据类型是否有错误 数据库类型设计没有出现问题 (2)数据库没有问题就看实体类&#xf…

Xavier初始化方法

avier初始化方法是一种常用的神经网络参数初始化方法,旨在有效地初始化权重,以促进神经网络的训练。该方法的提出者是Xavier Glorot和Yoshua Bengio,因此得名为“Xavier”。 在深度学习中,参数初始化是至关重要的,因为…

tcp/ip是什么意思,tcp/ip协议包含哪几层

TCP/IP是一种网络通信协议,它是互联网所采用的基本协议。TCP/IP协议是由美国国防部高级研究计划局(ARPA)在上世纪70年代设计开发的,经过多年发展和完善,已成为全球范围内最重要的网络通信协议之一。 首先,让…

【CKA模拟题】Ingress新手必看,全面了解Ingress的基础操作

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesThere exists a deployment named nginx-deployment exposed through a service called nginx-service . Create an ingress resource…

【“得到”用户访谈会-参会感受】

在三月左右的时候,收到了《得到》的一个用户访谈的邀请,自己以前并没有这样的经历,所以觉得能有这样的体验还是挺不错的,所以说一说参加前后的体验。 不知道现在有多少人,还会注意,或者很频繁地使用手机上…

【项目】基于YOLOv8和RotNet实现圆形滑块验证码(拼图)自动识别(通过识别中间圆形的角度实现)

TOC 一、引言 1.1 实现目标 要达到的效果是使用算法预测中间圆形的角度,返回给服务器,实现自动完成验证码的问题。要实现的内容如下图所示。 1.2 实现思路 思路1(效果较差):以RotNet要实现的验证码识别为灵感&…

MQ消息队列从入门到精通速成

文章目录 1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比: 2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现 2.5.总结 3.SpringAMQP3.1.Basic Queue 简单队列模型3.1.1.…

深入理解SHA系列哈希算法:安全性的保障与演进

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 本文将深入探讨SHA(Secure Hash Algorithm)系列哈希算法的工作原理、应用场景及其安全性。我们将了解SHA系…

35.基于SpringBoot + Vue实现的前后端分离-在线考试系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的在线考试系统设计与实现管理工作系统…

深入探讨Maven打包:打造精致的Zip包

在部署Spring Boot生产项目时,首先需要使用Maven将其打包成一个JAR文件或者包含JAR文件的ZIP文件。随后,通过堡垒机将打包好的文件上传至服务器进行部署,或构建成Docker镜像进行发布。在这一过程中,我们需要将项目中的配置文件或静…

Unity 布局控制器Content Size Fitter

Content Size Fitter是Unity中的一种布局控制器组件,用于根据其内容的大小来调整包含它的UI元素的大小。换句话来说就是,Content Size Fitter可以根据UI元素内部内容的大小,自动调整UI元素的大小,以确保内容能够正确显示。 如下图…

深度强化学习(十)(TRPO)

深度强化学习(十)(TRPO与PPO) 一.信赖域方法 原问题: maxmize J ( θ ) \text{maxmize} \qquad\qquad J(\theta) maxmizeJ(θ) J J J是个很复杂的函数,我们甚至可能不知道 J J J 的解析表达式&#xff…

华为ENSP的VLAN原理和配置命令

CSDN 成就一亿技术人! 作者主页:点击! ENSP专栏:点击! CSDN 成就一亿技术人! ————前言———— VLAN(Virtual Local Area Network,虚拟局域网)是一种在物理网络基…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针赋值和测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针(非函数指针): 有类型的函数指针: void 类型的指针: 结语 前言 进行单元测试之后,但凡…

STM32技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案

文章目录 一、简易刷卡式打卡考勤系统(一)功能简介原理图设计程序设计 哔哩哔哩: https://www.bilibili.com/video/BV1NZ421Y79W/?spm_id_from333.999.0.0&vd_sourcee5082ef80535e952b2a4301746491be0 一、简易刷卡式打卡考勤系统 &…

数据在内存的存储(2)【浮点数在内存的存储】

一.浮点数以什么形式存储在内存中 根据根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V都可以存储为这样的形式: V(-1)^S*M*2^E。 (1)(-1)^…

[免费]通义灵码做活动,送礼品,快来薅羊毛!!!

你的编辑器装上智能ai编辑了吗,的确挺好用的。 最近阿里云AI编码搞活动,可以免费体验并且还可以抽盲盒。有日历、马克杯、代金券、等等其他数码产品。 大多数都是日历。 点击链接参与「通义灵码 体验 AI 编码,开 AI 盲盒」 https://develope…

蓝桥杯2023真题-幸运数字

目录 进制转换: 思路 代码 题目链接: 0幸运数字 - 蓝桥云课 (lanqiao.cn) 本题就考的进制转换问题,要将十进制5转换成二进制,通过%2,和/2的交替使用即可完成,所得余数就是转换成的二进制各位的值,转换…