如何同时去除模糊/模糊和旋转?

How can I remove blur / blur and rotate at the same time?

我是 python 的初学者,正在学习 PIL 和 tkinter。

现在我正在尝试编辑图像,但我正在努力解决模糊和旋转问题。

当我模糊图像时,如果不旋转它就无法去除它。 (我想做一个按钮来on/off模糊)

如果我 blur/rotate 一张图片, 另一个不能同时工作

我该如何解决这个问题?这是我的代码

import tkinter as tk
from PIL import Image, ImageTk, ImageFilter
from tkinter import filedialog as fd

img=None
tk_img=None
angle=0

def open():
    global img, tk_img
    filename=fd.askopenfilename()
    img=Image.open(filename)
    tk_img=ImageTk.PhotoImage(img)
    canvas.create_image(250,250,image=tk_img)
    window.update()

def quit():
    window.destroy()

def image_rotate():
    global img,tk_img,angle
    angle=angle+45
    tk_img=ImageTk.PhotoImage(img.rotate(angle))
    canvas.create_image(250,250,image=tk_img)
    window.update()

def image_blur():
    global img,tk_img
    tk_img=ImageTk.PhotoImage(img.filter(ImageFilter.BLUR))
    canvas.create_image(250,250,image=tk_img)
    window.update()
    

window = tk.Tk() #윈도우 생성
canvas=tk.Canvas(window,width=500,height=500)
canvas.pack()

menubar = tk.Menu(window) #메뉴바 생성

filemenu = tk.Menu(menubar) #파일메뉴를 메뉴바에 달아줌 
filemenu.add_command(label="picture", command=open)
filemenu.add_command(label="exit", command=quit)
menubar.add_cascade(label="파일", menu=filemenu)

imagemenu=tk.Menu(menubar)
imagemenu.add_command(label="rotate",command=image_rotate)
imagemenu.add_command(label="blur",command=image_blur)
menubar.add_cascade(label="movement", menu=imagemenu)

window.config(menu=menubar)
window.mainloop()

您可以使用 opencv 包对图像进行模糊处理

import cv2 
  

img = cv2.imread('imagepath') 
  
blurImg = cv2.blur(img,(10,10)) 
cv2.imshow('blurred image',blurImg)
  
cv2.waitKey(0)
cv2.destroyAllWindows()

或者你可以查看opencv的文档来模糊图像。 你也可以使用 opencv

旋转图像
# importing cv2
import cv2

src = cv2.imread(path)
window_name = 'Image'
image = cv2.rotate(src, cv2.ROTATE_90_COUNTERCLOCKWISE)
  # Displaying the image
cv2.imshow(window_name, image)
cv2.waitKey(0)

原因很明显,您看到的 img 对象在 open() 中只有 defined/updated,因此图像将始终引用所选的原始图像,而不是新编辑的图像图像,以便显示更改将其存储在一个新变量中,然后将其全局化。

另请注意,每次调用该函数时都会创建一个新的 canvas 图像,效率不高,因此请制作一个 canvas 图像,然后每次更新它,在使用 itemconfig() 方法的函数。

def open():
    global img, tk_img

    filename = fd.askopenfilename()
    img = Image.open(filename)
    tk_img = ImageTk.PhotoImage(img)
    canvas.itemconfig('img',image=tk_img) # Update image

def image_rotate():
    global tk_img, angle, img

    angle += 45 # More pythonic to always use += rather than a = a + 10
    img = img.rotate(angle)
    tk_img = ImageTk.PhotoImage(img)
    canvas.itemconfig('img',image=tk_img) # Update image
    angle -= 45

def image_blur():
    global tk_img, img

    img = img.filter(ImageFilter.BLUR)
    tk_img = ImageTk.PhotoImage(img)
    canvas.itemconfig('img',image=tk_img) # Update image
    

canvas = tk.Canvas(window,width=500,height=500)
canvas.create_image(250,250,tag='img') # Create initial canvas object
canvas.pack()

另请查看我如何格式化您的代码以使其看起来更接近,请关注 PEP 8 -- Style Guide for Python Code 以获取更多信息。