/
karik
/
sixth
Обзор
Документация
Войти
/
karik
/
sixth
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
6.py
171 строка
6 KB
karik
upload files
17 ноя 2025, 22:43
17 ноя 2025, 22:43
e242dbe
Код
Авторство
О чём код?
import cv2 import numpy as np import tkinter as tk from tkinter import filedialog from PIL import Image, ImageTk def load_image(): path = filedialog.askopenfilename( title="Выберите изображение", filetypes=[("Image Files", "*.png;*.jpg;*.jpeg;*.bmp")] ) if not path: raise ValueError("Файл не выбран") pil_img = Image.open(path).convert("RGB") img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR) return img, path def affine_transform(img, angle_deg, scale): h, w = img.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle_deg, scale) transformed = cv2.warpAffine(img, M, (w, h)) return transformed, M def inverse_affine_transform(img, M): h, w = img.shape[:2] M3 = np.vstack([M, [0, 0, 1]]) Minv = np.linalg.inv(M3)[0:2] restored = cv2.warpAffine(img, Minv, (w, h)) return restored def nonlinear_transform(img): h, w = img.shape[:2] X = np.tile(np.arange(w), (h, 1)) Y = np.tile(np.arange(h).reshape(-1, 1), (1, w)) X_new = np.sinh(X/100) X_new = np.clip(X_new, 0, w - 1) X_new = X_new.astype(np.float32) Y = Y.astype(np.float32) warped = cv2.remap(img, X_new, Y, interpolation=cv2.INTER_LINEAR) return warped def cv_to_tk(img): img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) im = Image.fromarray(img_rgb) im = im.resize((300, 300)) return ImageTk.PhotoImage(im) def save_image(img): path = filedialog.asksaveasfilename( defaultextension=".png", filetypes=[("PNG", "*.png"), ("JPEG", "*.jpg;*.jpeg"), ("BMP", "*.bmp")] ) if path: cv2.imwrite(path, img) print("Сохранено в:", path) def process_images(angle, scale, labels, imgs_dict): try: img, path = load_image() except Exception as e: print("Ошибка при загрузке файла:", e) return transformed, M = affine_transform(img, angle, scale) restored = inverse_affine_transform(transformed, M) nonlinear = nonlinear_transform(img) # Сохраняем изображения в словарь для кнопок сохранения imgs_dict["orig"] = img imgs_dict["affine"] = transformed imgs_dict["restored"] = restored imgs_dict["nonlinear"] = nonlinear # Отображение labels["orig_img"] = cv_to_tk(img) labels["orig"].config(image=labels["orig_img"]) labels["affine_img"] = cv_to_tk(transformed) labels["affine"].config(image=labels["affine_img"]) labels["restored_img"] = cv_to_tk(restored) labels["restored"].config(image=labels["restored_img"]) labels["nonlinear_img"] = cv_to_tk(nonlinear) labels["nonlinear"].config(image=labels["nonlinear_img"]) print("Изображения обработаны и отображены.") def start_gui(): root = tk.Tk() root.title("Аффинные и нелинейные преобразования") tk.Label(root, text="Угол поворота (°):").grid(row=0, column=0) angle_entry = tk.Entry(root) angle_entry.grid(row=0, column=1) tk.Label(root, text="Масштаб (например 1.0):").grid(row=1, column=0) scale_entry = tk.Entry(root) scale_entry.grid(row=1, column=1) # Создаём словарь для отображения и хранения изображений labels = { "orig": tk.Label(root), "affine": tk.Label(root), "restored": tk.Label(root), "nonlinear": tk.Label(root), } imgs_dict = {} # Подписи и изображения row = 2 # Оригинал tk.Label(root, text="Исходное изображение").grid(row=row, column=0) labels["orig"].grid(row=row + 1, column=0) tk.Button(root, text="Сохранить", command=lambda: save_image(imgs_dict.get("orig"))).grid(row=row + 2, column=0) # Аффинное tk.Label(root, text="Аффинное преобразование").grid(row=row, column=1) labels["affine"].grid(row=row + 1, column=1) tk.Button(root, text="Сохранить", command=lambda: save_image(imgs_dict.get("affine"))).grid(row=row + 2, column=1) # Восстановление tk.Label(root, text="Восстановленное изображение").grid(row=row + 3, column=0) labels["restored"].grid(row=row + 4, column=0) tk.Button(root, text="Сохранить", command=lambda: save_image(imgs_dict.get("restored"))).grid(row=row + 5, column=0) # Нелинейное tk.Label(root, text="Нелинейное преобразование").grid(row=row + 3, column=1) labels["nonlinear"].grid(row=row + 4, column=1) tk.Button(root, text="Сохранить", command=lambda: save_image(imgs_dict.get("nonlinear"))).grid(row=row + 5, column=1) # Кнопка запуска обработки def on_run(): try: angle = float(angle_entry.get()) scale = float(scale_entry.get()) process_images(angle, scale, labels, imgs_dict) except ValueError: print("Введите корректные числовые значения!") tk.Button( root, text="Выбрать изображение и обработать", command=on_run ).grid(row=10, column=0, columnspan=2, pady=10) root.mainloop() start_gui()