图像变换(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()

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

封奚泽优

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值