Optimizing High-Throughput SEM for Large-area Defect Characterization in AM Steel

from ipywidgets import Image, Label, Layout, VBox, SelectionSlider, HBox
from IPython.display import display
from PIL import Image as Img
import numpy as np
from io import BytesIO
from cv2 import resize, imread

Image.MAX_IMAGE_PIXELS = None

def Downgrade(img):
    new_width = int(img.shape[1] * 0.5)  # Reduce width by 50%
    new_height = int(img.shape[0] * 0.5)  # Reduce height by 50%
    new_dimensions = (new_width, new_height)
    img2 = resize(img, new_dimensions)
    return img2

def imgToNpy(img, downgrade=True):
    img = imread(img, 1)[:,:,0]
    if downgrade:
        img = Downgrade(img)
    return img

def imgToBuffer(img):
    img = Img.fromarray(img)
    buffer = BytesIO()
    img.save(buffer, format='PNG')
    buffer.seek(0)
    return buffer.getvalue()

# Fixed image
files_path = "../Data/Widget1_Data.npz"
loaded_data = np.load(files_path)
fixed_image=loaded_data["raw_image_10ys"][1425:2425,1500:2500]
fixed_image_widget=Image(value=imgToBuffer(fixed_image), format='png', width=250, height=250)



# Placeholder for changing image
changing_image={"10 ys":Downgrade(loaded_data["raw_image_10ys"][1425:2425,1500:2500]),
                "1 ys":Downgrade(loaded_data["raw_image_1ys"][1425:2425,1500:2500]),
                "100 ns":Downgrade(loaded_data["raw_image_100ns"][1425:2425,1500:2500])}
changing_image2={"10 ys":Downgrade(loaded_data["final_pores_10ys"]),
                "1 ys":Downgrade(loaded_data["final_pores_1ys"]),
                "100 ns":Downgrade(loaded_data["final_pores_100ns"])}


del loaded_data

changing_image_widget = Image(value=imgToBuffer(changing_image["10 ys"]), format='png', width=250, height=250)
changing_image_widget2 = Image(value=imgToBuffer(changing_image2["10 ys"]), format='png', width=250, height=250)


# Create a label widget
label_widget_fixed = Label(value="Benchmark",layout=Layout(justify_content="center", display="flex"))
label_widget = Label(value="Dwell",layout=Layout(justify_content="center", display="flex"))
label_widget2 = Label(value="Analysed",layout=Layout(justify_content="center", display="flex"))


# Combine the label and image in a vertical box layout
labeled_image_fixed = VBox([label_widget_fixed, fixed_image_widget])
labeled_image = VBox([label_widget, changing_image_widget])
labeled_image2 = VBox([label_widget2, changing_image_widget2])


# Slider widget
slider = SelectionSlider(
    options=list(changing_image.keys()),
    value='10 ys',
    description='Dwell time:',
    continuous_update=True
)

def update_image(change):
    """Update the changing image when the slider value changes."""
    new_image=changing_image[change["new"]]
    changing_image_widget.value = imgToBuffer(new_image)


    new_image2=changing_image2[change["new"]]
    changing_image_widget2.value = imgToBuffer(new_image2)

# Observe slider changes
slider.observe(update_image, names='value')

# Centering the layout
image_box = HBox(
    [labeled_image_fixed, labeled_image,labeled_image2],
    layout=Layout(justify_content='center', align_items='center')
)
ui = VBox(
    [image_box, slider],
    layout=Layout(justify_content='center', align_items='center')
)

display(ui)