import gradio as gr import kornia as K from kornia.core import Tensor from kornia import morphology as morph import torch import numpy as np def morphological_operators(img, operator, kernel, kernel_size): # Convert input to tensor if isinstance(img, np.ndarray): img = torch.from_numpy(img).permute(2, 0, 1).float() / 255.0 elif isinstance(img, torch.Tensor): img = img.permute(2, 0, 1).float() if img.max() > 1.0: img = img / 255.0 else: raise ValueError(f"Unsupported image type: {type(img)}") img = img.unsqueeze(0) # Add batch dimension device = 'cpu' # 'cuda:0' for GPU img = img.to(device) kernels = { "Ones": torch.ones(kernel_size, kernel_size).to(device), "Eye": torch.eye(kernel_size).to(device), "Cross": torch.tensor([[0, 1, 0],[1, 1, 1],[0, 1, 0]]).to(device), } operations = { 'Dilation': morph.dilation(img, kernels[kernel]), 'Erosion': morph.erosion(img, kernels[kernel]), 'Open': morph.opening(img, kernels[kernel]), 'Close': morph.closing(img, kernels[kernel]), 'Gradient': 1. - morph.gradient(img, kernels[kernel]), 'Bottom Hat': 1. - morph.bottom_hat(img, kernels[kernel]), 'Top Hat': 1. - morph.top_hat(img, kernels[kernel]) } output = K.tensor_to_image(operations[operator].squeeze(0)) return output examples = [ ["examples/cat.png", "Dilation", "Ones", 3], ["examples/huggingface.jpg", "Close", "Eye", 5] ] title = "Kornia Morphological Operators" description = "
This is a Gradio demo for Kornia's Morphological Operators.
To use it, simply upload your image, or click one of the examples to load them, and select any morphological operator to run it! Read more at the links at the bottom.
" article = "Kornia Docs | Kornia Github Repo | Kornia Morphological Operators Tutorial
" with gr.Blocks(title=title) as demo: gr.Markdown(f"# {title}") gr.Markdown(description) with gr.Row(): input_image = gr.Image(label="Input Image") output_image = gr.Image(label="Output Image") with gr.Row(): operator = gr.Dropdown( choices=["Dilation", "Erosion", "Open", "Close", "Gradient", "Bottom Hat", "Top Hat"], label="Operator" ) kernel = gr.Radio( choices=["Ones", "Eye", "Cross"], label="Kernel Type" ) kernel_size = gr.Slider( minimum=1, maximum=7, step=2, value=3, label="Kernel size" ) apply_button = gr.Button("Apply Operator") apply_button.click( fn=morphological_operators, inputs=[input_image, operator, kernel, kernel_size], outputs=output_image ) gr.Examples( examples=examples, inputs=[input_image, operator, kernel, kernel_size], outputs=output_image, fn=morphological_operators, cache_examples=True ) gr.Markdown(article) if __name__ == "__main__": demo.launch()