Files
nerfstudio/lantern_scripts/aligning_interface/main.py
T
2024-09-04 09:14:08 -04:00

150 lines
5.6 KiB
Python

import json
import os
import cv2
from PIL import Image, ImageTk
import tkinter as tk
from tkinter import Scale
import numpy as np
from align_auto import align
from align_manual import align_manual
class ImageTransparencyAdjuster:
def __init__(self, master):
self.master = master
self.path_well = '...'
self.path_fast = '...'
self.path_transformed = '...'
self.path_merged = '...'
self.path_masks = '...'
self.json_file = '...'
os.makedirs(self.path_transformed, exist_ok=True)
os.makedirs(self.path_merged, exist_ok=True)
self.well_images = sorted(os.listdir(self.path_well))
self.fast_images = sorted(os.listdir(self.path_fast))
self.index = 82
self.matrix = np.zeros((3, 3))
self.merged_image = None
self.mask = None
self.master.title("Image Transparency Adjuster")
self.well, self.fast, self.warped_image = self.load_image_set(self.index)
frame = tk.Frame(master)
frame.pack(side=tk.LEFT)
self.label = tk.Label(frame)
self.label.pack()
slider = Scale(master, from_=0, to=100, orient=tk.HORIZONTAL, command=self.update_image)
slider.set(50)
slider.pack(side=tk.RIGHT, fill=tk.Y)
self.master.bind('<Key>', self.handle_key)
self.update_image(50)
def load_image_set(self, index):
well = cv2.cvtColor(cv2.imread(os.path.join(self.path_well, self.well_images[index])), cv2.COLOR_BGR2RGB)
fast = cv2.cvtColor(cv2.imread(os.path.join(self.path_fast, self.fast_images[index])), cv2.COLOR_BGR2RGB)
try:
warped_image = cv2.cvtColor(cv2.imread(os.path.join(self.path_transformed, self.fast_images[index])), cv2.COLOR_BGR2RGB)
except Exception:
print("Transformed image not found:", self.index, self.fast_images[self.index])
warped_image = fast
return well, fast, warped_image
def update_image(self, alpha):
alpha = float(alpha) / 100.0
beta = 1.0 - alpha
self.merged_image = cv2.addWeighted(self.well, beta, self.warped_image, alpha, 0)
merged_image = Image.fromarray(self.merged_image)
merged_image_tk = ImageTk.PhotoImage(merged_image)
self.label.config(image=merged_image_tk)
self.label.image = merged_image_tk
self.first_run = False
self.master.update()
self.master.focus_force()
def transform(self, manual, n):
if manual:
self.warped_image, self.matrix = align_manual(self.well, self.fast, n)
else:
try:
self.warped_image, self.matrix = align(self.well, self.fast)
print("Aligned!")
except Exception as e:
print("Failed to align.", e)
self.update_image(50)
def save_transformation(self):
try:
with open(self.json_file, 'r') as f:
data = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
data = {'matrices': []}
found = False
for item in data['matrices']:
if item['name'] == self.fast_images[self.index]:
item['matrix'] = self.matrix.tolist()
found = True
break
if not found:
named_matrix = {'name': self.fast_images[self.index], 'matrix': self.matrix.tolist()}
data['matrices'].append(named_matrix)
with open(self.json_file, 'w') as f:
json.dump(data, f, indent=4)
def delete_transformation(self):
try:
with open(self.json_file, 'r') as f:
data = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
data = {'matrices': []}
data['matrices'] = [item for item in data['matrices'] if item['name'] != self.fast_images[self.index]]
with open(self.json_file, 'w') as f:
json.dump(data, f, indent=4)
def handle_key(self, event):
if event.keysym in ['Right', 'Left']:
self.matrix = np.zeros((3, 3))
self.index += 1 if event.keysym == 'Right' else -1
self.well, self.fast, self.warped_image = self.load_image_set(self.index)
self.update_image(50)
print(self.index, self.fast_images[self.index])
elif event.keysym in ['Up', 'Down']:
self.matrix = np.zeros((3, 3))
self.warped_image = self.fast if event.keysym == 'Down' else cv2.cvtColor(cv2.imread(os.path.join(self.path_transformed, self.fast_images[self.index])), cv2.COLOR_BGR2RGB)
self.update_image(50)
elif event.keysym == 's':
cv2.imwrite(os.path.join(self.path_transformed, self.fast_images[self.index]), cv2.cvtColor(self.warped_image, cv2.COLOR_RGB2BGR))
cv2.imwrite(os.path.join(self.path_merged, self.fast_images[self.index]), cv2.cvtColor(self.merged_image, cv2.COLOR_RGB2BGR))
self.save_transformation()
print('Saved:', self.index, self.fast_images[self.index])
elif event.keysym == 'd':
try:
os.remove(os.path.join(self.path_transformed, self.fast_images[self.index]))
self.delete_transformation()
print('Deleted:', self.index, self.fast_images[self.index])
except (FileNotFoundError):
print('File not found:', self.index, self.fast_images[self.index])
else:
pts = {'a': 0, '4': 4, '6': 6, '8': 8, '1': 10}
if event.char in pts:
self.transform(event.char != 'a', pts[event.char])
if __name__ == "__main__":
root = tk.Tk()
app = ImageTransparencyAdjuster(root)
root.mainloop()