图像变换(python)

news2024/11/13 9:32:29

前言

这个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()

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

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

相关文章

shell实现查询进程号并批量kill(脚本)

问题或需求描述 在shell中,如果你想通过命令行查询出一系列匹配某个关键词的进程,并使用xargs命令批量结束这些进程,可以按照以下步骤操作: # 查询并提取进程号 pgrep -f "关键词" | xargs kill# 或者,如果…

Linux Load AVG linux 平均负载是什么? 简单解释说明

linux 命令基础汇总 命令&基础描述地址linux curl命令行直接发送 http 请求Linux curl 类似 postman 直接发送 get/post 请求linux ln创建链接(link)的命令创建链接(link)的命令linux linklinux 软链接介绍linux 软链接介绍l…

CI/CD实战-jenkins部署 3

安装 软件下载地址:Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 启动服务 安装推荐插件 不新建用户,使用admin账号登录 修改一下初始密码 新建项目测试 安装git命令 生成密钥 在gitlab中上传公钥 修改ssh 创建中…

22.保护性暂停扩展(一对一)

如果需要多个类之间使用GuardedObject对象,作为参数传递不是很方便,因此设计一个解耦的中间类,这样不仅能够解耦结果的等待者和结果生产者,还能够支持多个任务的管理。 Futures就好比居民楼一层的信箱,每个信箱有房间的…

清华大学突破性研究:GVGEN技术,7秒内从文字到3D高保真生成

引言:3D模型生成的挑战与机遇 随着计算机图形学的发展,3D模型的生成在各个行业中变得越来越重要,包括视频游戏设计、电影制作以及AR/VR技术等。在3D建模的不同方面中,从文本描述生成3D模型成为一个特别有趣的研究领域,…

哪些行业需要在线制作电子证书系统?

哪些行业需要在线制作电子证书系统? 1、教育机构:学校和培训机构需要为学生和培训者颁发证书,您的系统可以帮助他们快速生成和管理这些证书。 2、企业及政府部门:用于员工培训、资质认证等,提高内部管理效率。 3、专…

Learn OpenGL 29 延迟着色法

延迟着色法 我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading),它是我们渲染物体的一种非常直接的方式,在场景中我们根据所有光源照亮一个物体,之后再渲染下一个物体,以此类推。它非常…

2024 ccfcsp认证打卡 2023 09 01 坐标变换(其一)

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt(); // 操作次数int m in.nextInt(); // 初始坐标个数int temp_x 0; // 临时存储x的累加值int temp_y 0; // 临时存储y的累…

星云小窝项目1.0——项目启动(二)

星云小窝项目1.0——项目启动(二) 文章目录 前言1. 从Github从下载它2. 使用编辑器打开(以pycharm为例)2.1. 下载所需要的模块2.2. 配置mysql数据库2.3. 配置QQ邮箱发送验证码2.4. 修改代码3. 启动总结 前言 上一篇博客大致介绍了…

用户态和内核态:操作系统权限与运行模式解析

在现代计算机操作系统中,用户态(User Mode)和内核态(Kernel Mode)是两种重要的运行模式,用于区分用户程序与操作系统核心之间的权限和特权级别。深入理解这两种模式对于理解操作系统的工作原理至关重要。 …

发布文章积分自动增加

controller ApiOperation(value "添加文章")PostMapping("/addwengzhang")public String addwengzhang(RequestBody WengDto wengDto) {if (wengDto.getContent() null || wengDto.getTitle() null) {return "参数不可为空";}User user user…

CMakeLists生成动态库.so和静态库.a

一、下载NDK CMake - NDK : 26.2.11394342 或 23.1.7779620 - CMake : 3.22.1 二、新建android\app\CMakeLists.txt 文件CMakeLists.txt内容 cmake_minimum_required(VERSION 3.4.1) #mker为项目名称 project(mker)#设置生成的so动态库最后输出的路径 set(CMAKE_LIBRARY_OUTP…

【代驾+顺风车+货运】全开源双端APP代驾+顺风车+货运代驾小程序源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的,全开源未加密,这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍: 车主实名认证,驾驶证认证,车…

阿里云OSS对象存储完全开发手册(一篇学会阿里云OSS所有知识点)

一、什么是OSS存储 阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择&#…

生成可读取配置文件的独立运行jar程序

前言: 周五刚躺下,前线打来语音要个下载文件的小程序,下载路径和下载码需要根据配置获取,程序需要在服务器执行。当然配置的设计是个人设计的,不然每次更新下载码都要重新出具jar包,太麻烦。多年没写独立运行的jar包了,翻阅了相关资料,最终还是功夫不负有心人。想着这种…

计算机复试面试问答准备(未完)

目录 1、理解多态性2、怎么逆置⼀个链表3、顺序表和链表的区别4、树的存储结构5、什么是哈夫曼树?简述哈夫曼树的构造过程。介绍哈夫曼树的特性。6、哈夫曼编码的编码和解码过程7、图的遍历方式8、图的存储方式9、最小生成树10、迪杰斯特拉算法11、佛洛依德算法12、…

2024年3月26日 十二生肖 今日运势

小运播报:2024年3月26日,星期二,农历二月十七 (甲辰年丁卯月己丑日),法定工作日。 红榜生肖:鸡、鼠、猴 需要注意:马、狗、羊 喜神方位:东北方 财神方位:…

修改网站源码,给电子商城的商品添加图片时商品id为0的原因

修改网站源码,给电子商城的商品添加图片时商品id为0的原因。花了几个小时查找原因。后来,由于PictureControl.class.php是复制CourseControl.class.php而来,于是对比了这两个文件,在CourseControl.class.php找到了不一样的关键几条…

GEE入门及进阶教程|在 Earth Engine 中绘制图像集合

在前面的内容中,我们计算了增强植被指数 (EVI),以说明卫星图像上的波段运算,代码在单个图像上被调用一次。 如果我们想以相同的方式计算整个 ImageCollection 中的每个图像的 EVI,该怎么办?在这里,我们使用…

Java Swing游戏开发学习17

内容来自RyiSnow视频讲解 这一节讲的是Event(Damage Pit, Healing Pool, Teleport Tile),直译:事件(伤害深坑(类似陷阱吧),治愈池,传送瓦片) 事件(陷阱【掉进去回掉血】,治愈池【可…