图像变换(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) // 2
    y = (screen_height - relative_height) // 2
    # 设置窗口大小(用f{}格式化字符串)
    window.geometry(f"{relative_width}x{relative_height}+{x}+{y}")
    # 生成界面需要的框架
    module(window)
    # 运行窗口
    window.mainloop()


# 定义界面展示的组件
def module(window):
    # 声明全局变量img,combo
    global img
    global 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():
    # 声明全局变量photo
    global 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 - image
    return inverted_image


# 对数变换 s=c*log(1+r)
def log_transform(image, c=1):
    # 对图像进行对数变换
    transformed_image = c * np.log1p(image)
    # 将结果缩放到0~255
    transformed_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


if __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) // 2
    y = (screen_height - relative_height) // 2
    # 设置窗口大小(用f{}格式化字符串)
    window.geometry(f"{relative_width}x{relative_height}+{x}+{y}")
    # 生成界面需要的框架
    module(window)
    # 运行窗口
    window.mainloop()


# 定义界面展示的组件
def module(window):
    # 声明全局变量img,combo
    global 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():
    # 声明全局变量photo
    global 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 - image
    return inverted_image


# 对数变换 s=c*log(1+r)
def log_transform(image, c=1):
    # 对图像进行对数变换
    transformed_image = c * np.log1p(image)
    # 将结果缩放到0~255
    transformed_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_image


if __name__ == '__main__':
    # 生成初始界面
    Frame()

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

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

相关文章

Prometheus(六):Blackbox监控安装配置

目录 1 Blackbox Exporter安装配置1.1 Blackbox Exporter简介1.2 安装1、安装-使用源码包安装下载安装blackbox.yml文件配置快速启动文件 2、安装-使用docker 1.3 Prometheus配置1、http监控2、ping探测-ip3、https probe-DNS解析4、metrics配置5、TCP监控-探测端口 总结 1 Bla…

词曲创作只需几秒,「AI作曲家」Suno引爆音乐圈,第一手体验和攻略来了

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 有了 Suno 这个「作曲助手」,人人都可以创建自己想听的歌曲。 自…

【在FastAPI应用中嵌入Gradio界面的实现方法】如何在有一个Fastapi应用的基础上,新加一个gradio程序

官网教程:https://www.gradio.app/guides/sharing-your-app#mounting-within-another-fast-api-app 实践: import gradio as gr from fastapi import FastAPI from starlette.middleware.cors import CORSMiddlewareCUSTOM_PATH "/gradio"a…

Java八股文(SpringCloud)

Java八股文のSpringCloud SpringCloud SpringCloud 什么是Spring Cloud? Spring Cloud是一个用于构建分布式系统的开发工具箱,它基于Spring Boot框架,提供了一系列的组件和工具,用于帮助开发者快速搭建和管理分布式系统中的各种常…

javaSwing愤怒的小鸟游戏

一、简介 游戏名称是“愤怒的小鸟”,英文称为“AngryBird”。 “愤怒的小鸟”是著名游戏公司Rovio偶然间开发出来的益智游戏,从2009年12月上市到iOS。,讲述了鸟类和猪因为猪偷鸟蛋反生的一系列故事。游戏的类型版本是横向版本的水平视角&…

Warning logs 2024-03-23

给旧的笔记本安装ubuntu系统,并实现ssh远程连接 1、下载ubuntu系统 ubuntu下载链接 选择带桌面版本 2、准备U盘 3、使用UltraISO制作启动盘 使用UltraISO,打开刚才下载的ubuntu**.iso文件 4、进入BIOS,选择U盘启动 5、Warning 1 invali…

实时数仓项目《二》-利用chatgpt prompt完成基础维表的创建

系列文章: 实时数仓项目《一》-实时数仓架构-CSDN博客 目录 5. ods->dwd:维表关联方案及维表加工、导入hbase 5.1 维表关联方案 5.2 退维后结果去向 5.3 创建维表:基础业务库表数据同步到hbase 5.3.1 cdc 读取mysql数据,生成临时映射…

C/C++笔记-make编译时需要注意的问题(编译可执行程序时链接的so出现未定义的引用)

背景 环境是这样的,一个复杂的C项目,本来在A机器上能编译过去的,但放到B机器上编译可执行程序时链接的so出现未定义的引用。这就有点莫名奇妙了。 原因 我这边造成这个现象的原因有以下几点: ① 在makefile中所有的-I&#xff…

【LeetCode热题100】230. 二叉搜索树中第K小的元素(二叉树)

一.题目要求 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 二.题目难度 中等 三.输入样例 示例 1: 输入:root [3,1,4,null,2], k 1…

newOJ 1099: 输油管道问题

目录 题目链接: 思路: 代码: 题目链接: P1099 - 输油管道问题 - New Online Judge (ecustacm.cn) 思路: 因为主输油管道是由东向西的, 而每口油井要有一条输油管道和主输油管道连接(或南或北…

[DDD] ValueObject的一种设计落地及应用

目录 前言一、ValueObject二、设计2.1 接口2.2 单一值ValueObject2.3 单一字符串ValueObject 三、实现3.1 示例3.1.1 PhoneNumber3.1.2 SocialCreditCode 四、使用4.1 异常处理4.2 Json 反/序列化4.2.1 请求体4.2.2 HTTP接口4.2.3 用例 4.3 JPA/MyBatis4.3.1 Converter或TypeHa…

Harmony(鸿蒙)Stage模型综述

设计思想 ​Stage模型的设计,是为了提供给开发者一个更好的开发方式,更好的适用于多设备、分布式场景。 ​Stage模型的设计思想如下图所示。 ​Stage模型的设计基于如下三个出发点: 应用进程的有序管理 随着设备的内存越来越大&#xff0…

SM4加密是什么?SM4算法在国密HTTPS协议中的作用

SM4加密算法是一种分组密码标准,由国家密码管理局于2012年3月21日发布,相关标准为“GM/T 0002-2012《SM4分组密码算法》,与国际上广泛使用的AES等算法类似,SM4同算法样用于保护数据的机密性,确保信息在传输过程中不被未…

罗德与施瓦茨 RS®FSV3000 信号与频谱分析仪

R&SFSV3000 信号与频谱分析仪 罗德与施瓦茨 R&SFSV3000 信号与频谱分析仪一键即可测量,可以通过基于事件的操作捕获信号,并使用 SCPI 记录器轻松编写脚本程序,从而快速设置复杂测量。分析仪还具有出色的测量速度,可实…

学习鸿蒙基础(8)

一、BuilderParam装饰器 当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引…

关于「技术开发技能」课程

本课程分为三个部分,带您了解如何使用大模型平台、如何训练与部署大模型及生成式AI产品应用与开发,您将能了解各类服务的优势、功能、典型使用案例、技术概念和成本。 学习任选的两个课程模块,并通过测验者,将授予「技术开发技能…

【C++】哈希应用之布隆过滤器

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.布隆过滤器的提出…

vue基础——java程序员版(vue路由)

1、引入路由 在控制台执行vue ui,在插件市场里可以找到vue-router并导入。 ​ 一般情况下,vue会自动在main,js中引入vue-router,如下: import Vue from vue import App from ./App.vue import ./plugins/element.js import rou…

springboot整合aop实现自定义注解-方法运行异常重试demo

1.依赖引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>2.自定义注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retentio…

简易电路设计,PW1605芯片实现24V/30V/48V限流过压保护功能

一般描述 PW1605 是一款电流限制开关&#xff0c;具有可编程输入过压保护和输出电压箝位功能。集成保护 N 沟道 FET 具有极低的 RDS&#xff08;ON&#xff09; 功能&#xff0c;PW1605有助于降低正常工作期间的功率损耗。可编程软启动时间控制启动期间输出电压的压摆率。独立的…