OpenCV教程02:图像处理系统1.0(翻转+形态学+滤波+缩放+旋转)

-------------OpenCV教程集合-------------

Python教程99:一起来初识OpenCV(一个跨平台的计算机视觉库)

OpenCV教程01:图像的操作(读取+显示+保存+属性+获取和修改像素值)

OpenCV教程02:图像处理系统1.0(翻转+形态学+滤波+缩放+旋转)
OpenCV教程03:绘制图形(线段、矩形、圆形、椭圆、多边形、箭头线)+水印文本

1.准备一张要输入的图像素材,没有的话也可以拿下面的图片练习一下,大小为250250或300300。基于OpenCV+tkinter的图像处理系统1.0,主要功能,翻转+形态学+滤波+缩放+旋转的示例用法,代码已跑亲测有效。感兴趣的朋友,自己学习一下。当然运行该代码,一些必要的第三方安装包是必不可少的,自己看着源码,逐一模块安装一下。

2.py源码不足的地方:
a.仅支持png和jpe的图片格式,如果你要添加其他的图片格式,自己在源码里面的通用对话框增加一些格式,默认是显示png格式。
b.没有办法,保存生成的新图片,当然你可以参考,历史pillow教程博文中,tk是如何显示和保存图片的。
Pillow教程10:设计博文的文字背景封面图,再也不担心找不到素材了
c.显示图片的窗口大小是固定的,输入的图像最好为250*250,这样刚好显示。如果你要显示更大的,自己调一下tk窗口组件的大小。
在这里插入图片描述
运行后的效果
在这里插入图片描述

# -*- coding: utf-8 -*-
# @Author : 小红牛
# 微信公众号:WdPython
import tkinter.messagebox as messagebox
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import os
from tkinter.filedialog import askopenfilename, asksaveasfilename
import cv2
import numpy as npfile_path = os.path.dirname(__file__)
test_file_path = file_path + os.sep + 'example.png'WIN_WIDTH = 700
WIN_HEIGHT = 400class Image_sys():def __init__(self):self.root = tk.Tk()self.root.geometry('700x400+80+80')self.root.title('图像处理系统1.0——微信公众号:WdPython')  # 设置窗口标题# self.root.iconbitmap('icon/icon.ico')  # 设置窗口图标# scnWidth, scnHeight = self.root.maxsize()# 屏幕中心居中# center = '%dx%d+%d+%d' % (WIN_WIDTH, WIN_HEIGHT, (scnWidth - WIN_WIDTH) / 2, (scnHeight - WIN_HEIGHT) / 2)# print(center)# 设置窗口的大小宽x高+偏移量# self.root.geometry(center)# 调用方法会禁止根窗体改变大小self.root.resizable(False, False)menubar = tk.Menu(self.root)  # 创建菜单栏 (Menu)self.root.config(menu=menubar)# 创建文件下拉菜单# 文件菜单下 tearoff=0 表示有没有分隔符,默认为有分隔符file_menu = tk.Menu(menubar, tearoff=0)# 为顶级菜单实例添加菜单,并级联相应的子菜单实例menubar.add_cascade(label="文件", menu=file_menu)file_menu.add_command(label="打开测试文件", command=self.open_test_file)file_menu.add_command(label="打开自定义文件", command=self.open_file)file_menu.add_command(label="复原", command=self.recover)file_menu.add_command(label="清除", command=self.clear)file_menu.add_command(label="退出", command=self.exit_sys)# 创建翻转下拉菜单turn_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="翻转", menu=turn_menu)turn_menu.add_command(label="水平", command=self.flip_horizontal)turn_menu.add_command(label="垂直", command=self.flip_vertical)turn_menu.add_command(label="水平&垂直", command=self.flip_hor_ver)# 形态学morph_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="形态学", menu=morph_menu)morph_menu.add_command(label="腐蚀", command=self.mor_corrosion)morph_menu.add_command(label="膨胀", command=self.mor_expand)morph_menu.add_command(label="开运算", command=self.mor_open_operation)morph_menu.add_command(label="闭运算", command=self.mor_close_operation)morph_menu.add_command(label="Morphological Gradient", command=self.mor_gradient)morph_menu.add_command(label="顶帽", command=self.mor_top_hat)morph_menu.add_command(label="黑帽", command=self.mor_black_hat)# 滤波filter_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="滤波", menu=filter_menu)filter_menu.add_command(label="均值", command=self.filter_mean)filter_menu.add_command(label="方框", command=self.filter_box)filter_menu.add_command(label="高斯", command=self.filter_gauss)filter_menu.add_command(label="中值", command=self.filter_mid_value)filter_menu.add_command(label="双边", command=self.filter_bilateral)# 缩放scale_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="缩放", menu=scale_menu)scale_menu.add_command(label="放大PyrUp", command=self.scale_pyrup)scale_menu.add_command(label="缩小PyrDown", command=self.scale_pyrdown)scale_menu.add_command(label="放大Resize", command=self.scale_zoom_in)scale_menu.add_command(label="缩小Resize", command=self.scale_zoom_out)# 旋转rotate_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="旋转", menu=rotate_menu)rotate_menu.add_command(label="平移", command=self.rotate_offset)rotate_menu.add_command(label="仿射", command=self.rotate_affine)rotate_menu.add_command(label="透射", command=self.rotate_transmission)rotate_menu.add_command(label="顺时针-无缩放", command=self.rotate_clockwise)rotate_menu.add_command(label="顺时针-缩放", command=self.rotate_clockwise_zoom)rotate_menu.add_command(label="逆时针-缩放", command=self.rotate_anti_zoom)rotate_menu.add_command(label="零旋转-缩放", command=self.rotate_zero_zoom)# 帮助help_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="帮助", menu=help_menu)help_menu.add_command(label="版权", command=self.help_copyright)help_menu.add_command(label="关于", command=self.help_about)# 创建一个容器,其父容器为self.rootself.frame_scr = ttk.LabelFrame(self.root, text="Scour image:")# padx  pady   该容器外围需要留出的空余空间self.frame_scr.place(x=80, y=30, width=250, height=250)# 创建一个容器,其父容器为self.rootself.frame_des = ttk.LabelFrame(self.root, text="Destination image:")# padx  pady   该容器外围需要留出的空余空间self.frame_des.place(x=370, y=30, width=250, height=250)# 创建两个labellabel_scr = ttk.Label(self.root, text='源图像', font=25, foreground='blue', anchor='center')label_scr.place(x=150, y=280, width=100, height=50)label_des = ttk.Label(self.root, text='目标图像', font=25, foreground='blue', anchor='center')label_des.place(x=450, y=280, width=100, height=50)self.label_scr_image = Noneself.label_des_image = Noneself.path = ''self.root.mainloop()def open_test_file(self):self.path = test_file_pathimage = Image.open(self.path)test_image = ImageTk.PhotoImage(image)if (self.label_des_image != None):self.label_des_image.pack_forget()  # 隐藏控件self.label_des_image = Noneif (self.label_scr_image == None):self.label_scr_image = tk.Label(self.frame_scr, image=test_image)self.label_scr_image.configure(image=test_image)self.label_scr_image.pack()self.root.mainloop()def open_file(self):# 打开文件对话框open_img_path = askopenfilename(initialdir=file_path,filetypes=[("png格式", "png"), ("jpg格式", "jpg"), ("bmp格式", "bmp")],parent=self.root,title='打开自定义图片')if (open_img_path == ''):returnelse:if (self.label_des_image != None):self.label_des_image.pack_forget()  # 隐藏控件self.label_des_image = Noneself.path = open_img_pathimage = Image.open(self.path)tk_image = ImageTk.PhotoImage(image)if (self.label_scr_image == None):self.label_scr_image = tk.Label(self.frame_scr, image=tk_image)self.label_scr_image.configure(image=tk_image)self.label_scr_image.pack()  # 显示控件self.root.mainloop()def recover(self):if (self.path == ''):returnimage = Image.open(self.path)tk_image = ImageTk.PhotoImage(image)if (self.label_des_image == None):returnself.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()def clear(self):if (self.label_scr_image != None):self.label_scr_image.pack_forget()  # 隐藏控件self.label_scr_image = Noneself.path = ''if (self.label_des_image != None):self.label_des_image.pack_forget()  # 隐藏控件self.label_des_image = Noneself.path = ''def exit_sys(self):quit_root = messagebox.askokcancel('提示', '真的要退出么!~')if (quit_root == True):self.root.destroy()returndef flip_horizontal(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并# Flipped Horizontally 水平翻转image_hflip = cv2.flip(image, 1)image_pil_hflip = Image.fromarray(image_hflip)tk_image = ImageTk.PhotoImage(image_pil_hflip)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()def flip_vertical(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并# Flipped Horizontally 水平翻转image_hflip = cv2.flip(image, 0)  # 垂直翻转image_pil_hflip = Image.fromarray(image_hflip)tk_image = ImageTk.PhotoImage(image_pil_hflip)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()def flip_hor_ver(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并# Flipped Horizontally 水平翻转image_hflip = cv2.flip(image, -1)  # 水平垂直翻转image_pil_hflip = Image.fromarray(image_hflip)tk_image = ImageTk.PhotoImage(image_pil_hflip)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()def mor_corrosion(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并# kernel = np.ones((5, 5), np.uint8)# 指定核大小# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 矩形结构kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 椭圆结构# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 十字形结构img_erosion = cv2.erode(image, kernel)  # 腐蚀image_pil_erosion = Image.fromarray(img_erosion)tk_image = ImageTk.PhotoImage(image_pil_erosion)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 膨胀def mor_expand(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并# kernel = np.ones((5, 5), np.uint8)# 指定核大小# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 矩形结构kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 椭圆结构# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 十字形结构img_dilation = cv2.dilate(image, kernel)  # 膨胀image_pil_dilation = Image.fromarray(img_dilation)tk_image = ImageTk.PhotoImage(image_pil_dilation)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 开运算def mor_open_operation(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并# kernel = np.ones((5, 5), np.uint8)# 指定核大小# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 矩形结构kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 椭圆结构# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 十字形结构img_open_operation = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)  # 开运算image_pil_open = Image.fromarray(img_open_operation)tk_image = ImageTk.PhotoImage(image_pil_open)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 闭运算def mor_close_operation(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并# kernel = np.ones((5, 5), np.uint8)# 指定核大小# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 矩形结构kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 椭圆结构# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 十字形结构img_close_operation = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)  # 闭运算image_pil_close = Image.fromarray(img_close_operation)tk_image = ImageTk.PhotoImage(image_pil_close)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 形态学梯度:膨胀图减去腐蚀图,dilation - erosion,这样会得到物体的轮廓:def mor_gradient(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并# kernel = np.ones((5, 5), np.uint8)# 指定核大小# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 矩形结构kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 椭圆结构# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 十字形结构img_gradient = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel)  # 形态学梯度image_pil_gradient = Image.fromarray(img_gradient)tk_image = ImageTk.PhotoImage(image_pil_gradient)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 顶帽def mor_top_hat(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并kernel = np.ones((7, 7), np.uint8)  # 指定核大小# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 矩形结构# kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 椭圆结构# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 十字形结构img_top_hat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel)  # 顶帽image_pil_top_hat = Image.fromarray(img_top_hat)tk_image = ImageTk.PhotoImage(image_pil_top_hat)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 黑帽def mor_black_hat(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并kernel = np.ones((7, 7), np.uint8)  # 指定核大小# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 矩形结构# kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 椭圆结构# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 十字形结构img_black_hat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)  # 黑帽image_pil_black_hat = Image.fromarray(img_black_hat)tk_image = ImageTk.PhotoImage(image_pil_black_hat)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()'''常见噪声有椒盐噪声和高斯噪声,椒盐噪声可以理解为斑点,随机出现在图像中的黑点或白点;高斯噪声可以理解为拍摄图片时由于光照等原因造成的噪声;这样解释并不准确,只要能简单分辨即可。'''# 均值滤波def filter_mean(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并img_mean = cv2.blur(image, (3, 3))  # 均值滤波image_pil_mean = Image.fromarray(img_mean)tk_image = ImageTk.PhotoImage(image_pil_mean)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 方框滤波方框滤波跟均值滤波很像,当可选参数normalize为True的时候,方框滤波就是均值滤波,# 如3×3的核,a就等于1/9;normalize为False的时候,a=1,相当于求区域内的像素和。def filter_box(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并img_box = cv2.boxFilter(image, -1, (3, 3), normalize=False)  # 方框滤波image_pil_box = Image.fromarray(img_box)tk_image = ImageTk.PhotoImage(image_pil_box)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 高斯滤波与两种滤波方式,卷积核内的每个值都一样,相当于图像区域中每个像素的权重也就一样。# 高斯滤波的卷积核权重并不相同,中间像素点权重最高,越远离中心的像素权重越小。# 高斯滤波相比均值滤波效率要慢,但可以有效消除高斯噪声,能保留更多的图像细节,所以经常被称为最有用的滤波器。def filter_gauss(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并img_gauss = cv2.GaussianBlur(image, (1, 1), 1)  # 方框滤波image_pil_gauss = Image.fromarray(img_gauss)tk_image = ImageTk.PhotoImage(image_pil_gauss)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 中值滤波,中值又叫中位数,是所有值排序后取中间的值。# 中值滤波就是用区域内的中值来代替本像素值,所以那种孤立的斑点,# 如0或255很容易消除掉,适用于去除椒盐噪声和斑点噪声。中值是一种非线性操作,效率相比前面几种线性滤波要慢。# 斑点噪声图,用中值滤波显然更好:def filter_mid_value(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并img_mid_value = cv2.medianBlur(image, 5)  # 中值滤波image_pil_mid_value = Image.fromarray(img_mid_value)tk_image = ImageTk.PhotoImage(image_pil_mid_value)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 双边滤波,模糊操作基本都会损失掉图像细节信息,尤其前面介绍的线性滤波器,图像的边缘信息很难保留下来。# 然而,边缘edge信息是图像中很重要的一个特征,所以这才有了双边滤波。def filter_bilateral(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并img_bilateral = cv2.bilateralFilter(image, 9, 75, 75)  # 双边滤波image_pil_bilateral = Image.fromarray(img_bilateral)tk_image = ImageTk.PhotoImage(image_pil_bilateral)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()# 图像金字塔操作的将是图像的像素问题(图像变清晰了还是模糊了)# 图像金字塔主要有两类:高斯金字塔和拉普拉斯金字塔。def scale_pyrup(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并img_pyrup = cv2.pyrUp(image)  # 高斯金字塔image_pil_pyrup = Image.fromarray(img_pyrup)tk_image = ImageTk.PhotoImage(image_pil_pyrup)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.pack()self.root.mainloop()def scale_pyrdown(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并img_pyrdown = cv2.pyrDown(image)  # 高斯金字塔image_pil_pyrdown = Image.fromarray(img_pyrdown)tk_image = ImageTk.PhotoImage(image_pil_pyrdown)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)# self.label_des_image.place(relx=0,rely=0)# 放置组件的不同方式self.label_des_image.pack()self.root.mainloop()# 放大def scale_zoom_in(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并size = (2 * image.shape[1], 2 * image.shape[0])img_zoom_in = cv2.resize(image, size)  # 放大image_pil_zoom_in = Image.fromarray(img_zoom_in)tk_image = ImageTk.PhotoImage(image_pil_zoom_in)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)self.label_des_image.place(x=0, y=0)  # 放置组件的不同方式与金字塔放大相比对齐方式不同显示不同# self.label_des_image.pack()self.root.mainloop()# 缩小def scale_zoom_out(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并size = (int(0.3 * image.shape[1]), int(0.3 * image.shape[0]))img_zoom_out = cv2.resize(image, size)  # 放大image_pil_zoom_out = Image.fromarray(img_zoom_out)tk_image = ImageTk.PhotoImage(image_pil_zoom_out)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)# self.label_des_image.place(x=0, y=0)self.label_des_image.pack()self.root.mainloop()# 平移def rotate_offset(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并width, height = image.shape[1], image.shape[0]direction = np.float32([[1, 0, 50], [0, 1, 50]])  # 沿x轴移动50,沿y轴移动50img_offset = cv2.warpAffine(image, direction, (width, height))image_pil_offset = Image.fromarray(img_offset)tk_image = ImageTk.PhotoImage(image_pil_offset)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)# self.label_des_image.place(x=0, y=0)self.label_des_image.pack()self.root.mainloop()# 仿射-需要三个点坐标def rotate_affine(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并width, height = image.shape[1], image.shape[0]pts1 = np.float32([[50, 50], [200, 50], [50, 200]])pts2 = np.float32([[10, 100], [200, 50], [100, 250]])rot_mat = cv2.getAffineTransform(pts1, pts2)  # 沿x轴移动50,沿y轴移动50img_affine = cv2.warpAffine(image, rot_mat, (width, height))image_pil_affine = Image.fromarray(img_affine)tk_image = ImageTk.PhotoImage(image_pil_affine)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)# self.label_des_image.place(x=0, y=0)self.label_des_image.pack()self.root.mainloop()# 透射 -需要四个点的坐标def rotate_transmission(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并width, height = image.shape[1], image.shape[0]pts1 = np.float32([[56, 65], [238, 52], [28, 237], [239, 240]])pts2 = np.float32([[0, 0], [250, 0], [0, 250], [250, 250]])rot_mat = cv2.getPerspectiveTransform(pts1, pts2)img_clockwise = cv2.warpPerspective(image, rot_mat, (250, 250))  # 透射与仿射的函数不一样image_pil_clockwise = Image.fromarray(img_clockwise)tk_image = ImageTk.PhotoImage(image_pil_clockwise)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)# self.label_des_image.place(x=0, y=0)self.label_des_image.pack()self.root.mainloop()# 顺时针无缩放def rotate_clockwise(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并width, height = image.shape[1], image.shape[0]rotate_center = (width // 2, height // 2)rot_mat = cv2.getRotationMatrix2D(rotate_center, angle=-45, scale=1)  # 旋转中心rotate_center,角度degree, 缩放scaleimg_clockwise = cv2.warpAffine(image, rot_mat, (width, height))image_pil_clockwise = Image.fromarray(img_clockwise)tk_image = ImageTk.PhotoImage(image_pil_clockwise)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)# self.label_des_image.place(x=0, y=0)self.label_des_image.pack()self.root.mainloop()# 顺时针-缩放def rotate_clockwise_zoom(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并width, height = image.shape[1], image.shape[0]rotate_center = (width // 2, height // 2)rot_mat = cv2.getRotationMatrix2D(rotate_center, angle=-45, scale=0.6)  # 旋转中心rotate_center,角度degree, 缩放scaleimg_clockwise_zoom = cv2.warpAffine(image, rot_mat, (width, height))image_pil_clockwise_zoom = Image.fromarray(img_clockwise_zoom)tk_image = ImageTk.PhotoImage(image_pil_clockwise_zoom)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)# self.label_des_image.place(x=0, y=0)self.label_des_image.pack()self.root.mainloop()# 逆时针-缩放def rotate_anti_zoom(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并width, height = image.shape[1], image.shape[0]rotate_center = (width // 2, height // 2)rot_mat = cv2.getRotationMatrix2D(rotate_center, angle=45, scale=0.6)  # 旋转中心rotate_center,角度degree, 缩放scaleimg_clockwise_zoom = cv2.warpAffine(image, rot_mat, (width, height))image_pil_clockwise_zoom = Image.fromarray(img_clockwise_zoom)tk_image = ImageTk.PhotoImage(image_pil_clockwise_zoom)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)# self.label_des_image.place(x=0, y=0)self.label_des_image.pack()self.root.mainloop()# 零旋转-缩放def rotate_zero_zoom(self):if (self.path == ''):returnif (self.label_scr_image == None):returnimage = cv2.imdecode(np.fromfile(self.path, dtype=np.uint8), 1)  # 读取图片b, g, r = cv2.split(image)  # 三通道分离image = cv2.merge([r, g, b])  # 三通道合并width, height = image.shape[1], image.shape[0]rotate_center = (width // 2, height // 2)rot_mat = cv2.getRotationMatrix2D(rotate_center, angle=0, scale=0.6)  # 旋转中心rotate_center,角度degree, 缩放scaleimg_zero_zoom = cv2.warpAffine(image, rot_mat, (width, height))image_pil_zero_zoom = Image.fromarray(img_zero_zoom)tk_image = ImageTk.PhotoImage(image_pil_zero_zoom)if (self.label_des_image == None):self.label_des_image = tk.Label(self.frame_des, image=tk_image)self.label_des_image.configure(image=tk_image)# self.label_des_image.place(x=0, y=0)self.label_des_image.pack()self.root.mainloop()def help_copyright(self):tk.messagebox.showinfo(title='版权', message='微信公众号:WdPython!~')def help_about(self):tk.messagebox.showinfo(title='关于', message='微信公众号:WdPython!~!~')if __name__ == '__main__':Image_sys()

完毕!!感谢您的收看

----------★★历史博文集合★★----------

我的零基础Python教程,Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字典数据可视化 matplotlib 词云图 Pyecharts 海龟画图 Pandas Bug处理 电脑小知识office自动化办公 编程工具 NumPy Pygame

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

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

相关文章

数字化精益生产系统--QMS质量管理系统

QMS质量管理系统(Quality Management System)是现代企业管理的关键组成部分,旨在确保产品和服务的质量达到或超过客户需求和期望。 以下是对QMS质量管理系统的功能设计:

运维系列.Nginx配置文件结构功能总结

运维系列 Nginx配置文件结构功能总结 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_285…

塑造卓越企业家IP:多维度视角下的策略解析

在构建和塑造企业家IP的过程中,我们需要从多个维度进行考量,以确保个人品牌能够全面、立体地展现企业家的独特魅力和价值。以下是从不同角度探讨如何做好一个企业家IP的策略。 一、从个人特质出发 深入了解自我:企业家需要清晰地认识到自己的…

Linux 系统管理 03——安装及管理程序

一、rpm 包安装 1、RPM Package Manger 由 Red Hat 公司提供,被众多 Linux 发行版本所采用。 建立统一的数据库文件,详细记录软件包安装、卸载等变化信息,能够自动分析软件包 依赖关系。 2、RPM 软件包 一般命名格式 3、查询已安装的 RP…

电路基础知识汇总

1.0 串连,并联,混连 串联的定义 电路串联是一种电路元件的连接方式,其中各个元件沿着单一路径互相连接,形成一个连续的链。在串联电路中,每个节点最多只连接两个元件,这意味着电流只有一条路径可以通过整个…

昇思25天学习打卡营第十一天|DCGAN生成漫画头像

练习营进入第11天了,今天学习的内容是DCGAN生成漫画头像,记录一下学习内容: GAN基础原理 这部分原理介绍参考GAN图像生成。 DCGAN原理 DCGAN(深度卷积对抗生成网络,Deep Convolutional Generative Adversarial Net…

Java的基础语法

叠甲:以下文章主要是依靠我的实际编码学习中总结出来的经验之谈,求逻辑自洽,不能百分百保证正确,有错误、未定义、不合适的内容请尽情指出! 文章目录 1.第一份程序1.1.代码编写1.2.代码运行1.2.1.命令行编译1.2.2.IEDA…

FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能

作为今年最受期待的音乐制作 DAW 更新之一,FL Studio 2024发布引入了新功能,同时采用了新的命名方式,从现在起将把发布年份纳入其名称中。DAW 的新增功能包括在 FL Cloud 中添加插件、AI 驱动的音乐创作工具和 FL Studio 的新效果。 FL Cloud…

【项目设计】负载均衡式——Online Judge

负载均衡式——Online Judge😎 前言🙌Online Judge 项目一、项目介绍二、项目技术栈三、项目使用环境四、项目宏观框架五、项目后端服务实现过程1、comm模块设计1.1 Log.hpp实现1.2 Util.hpp实现 2、compiler_server 模块设计2.1compile.hpp文件代码编写…

调制信号识别系列 (一):基准模型

调制信号识别系列 (一):基准模型 说明:本文包含对CNN和CNNLSTM基准模型的复现,模型架构参考下述两篇文章 文章目录 调制信号识别系列 (一):基准模型一、论文1、DL-PR: Generalized automatic modulation classification method b…

ThreadPoolExecutor - 管理线程池的核心类

下面是使用给定的初始参数创建一个新的 ThreadPoolExecutor &#xff08;构造方法&#xff09;。 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,…

【Python】搭建属于自己 AI 机器人

目录 前言 1 准备工作 1.1 环境搭建 1.2 获取 API KEY 2 写代码 2.1 引用库 2.2 创建用户 2.3 创建对话 2.4 输出内容 2.5 调试 2.6 全部代码 2.7 简短的总结 3 优化代码 3.1 规范代码 3.1.1 引用库 3.1.2 创建提示词 3.1.3 创建模型 3.1.4 规范输出&#xf…

Git详细安装和使用教程

文章目录 准备工作-gitee注册认识及安装GitGit配置用户信息本地初始化Git仓库记录每次更新到仓库查看及切换历史版本Git忽略文件和查看文件状态Git分支-查看及切换Git分支-创建分支Git分支-合并及删除分支Git分支-命令补充Git分支-冲突需求: 准备工作-gitee注册 传送门: gite…

HDF4文件转TIF格式

HDF4 HDF4&#xff08;Hierarchical Data Format version 4&#xff09;是一种用于存储和管理机器间数据的库和多功能文件格式。它是一种自描述的文件格式&#xff0c;用于存档和管理数据。 HDF4与HDF5是两种截然不同的技术&#xff0c;HDF5解决了HDF4的一些重要缺陷。因此&am…

[终端安全]-3 移动终端之硬件安全(TEE)

&#xff08;参考资料&#xff1a;TrustZone for V8-A. pdf&#xff0c;来源ARM DEVELOPER官网&#xff09; TEE&#xff08;Trusted Execution Environment&#xff0c;可信执行环境&#xff09;是用于执行敏感代码和处理敏感数据的独立安全区域&#xff1b;以ARM TrustZone为…

cs231n作业1——Softmax

参考文章&#xff1a;cs231n assignment1——softmax Softmax softmax其实和SVM差别不大&#xff0c;两者损失函数不同&#xff0c;softmax就是把各个类的得分转化成了概率。 损失函数&#xff1a; def softmax_loss_naive(W, X, y, reg):loss 0.0dW np.zeros_like(W)num_…

信号与系统笔记分享

文章目录 一、导论信号分类周期问题能量信号和功率信号系统的线性判断时变&#xff0c;时不变系统因果系统判断记忆性系统判断稳定性系统判断 二、信号时域分析阶跃函数冲激函数取样性质四种特性1 筛选特性2 抽样特性3 展缩特性4 卷积特性卷积作用 冲激偶函数奇函数性质公式推导…

Ubuntu 20.04下多版本CUDA的安装与切换 超详细教程

目录 前言一、安装 CUDA1.找到所需版本对应命令2.下载 .run 文件3.安装 CUDA4.配置环境变量4.1 写入环境变量4.2 软连接 5.验证安装 二、安装 cudnn1.下载 cudnn2.解压文件3.替换文件4.验证安装 三、切换 CUDA 版本1.切换版本2.检查版本 前言 当我们复现代码时&#xff0c;总会…

彻底解决Path with “WEB-INF“ or “META-INF“: [WEB-INF/views/index.jsp]

背景描述 项目使用的是springboot2jsp的架构。以前好好的项目复制了一份&#xff0c;然后就无法访问报错。百度了好久都乱七八糟的&#xff0c;还没有解决问题。错误消息如下&#xff1a; 2024-07-05 15:45:51.335 INFO [http-nio-12581-exec-1]org.springframework.web.ser…

Linux服务器使用总结-不定时更新

# 查看升级日志 cat /var/log/dpkg.log |grep nvidia|grep libnvidia-common