Spaces:
Sleeping
Sleeping
File size: 3,915 Bytes
cb04bf5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
import gradio as gr
import cv2
import numpy as np
from PIL import Image
from ultralytics import YOLO # YOLOv8 from Ultralytics
# Load YOLOv8 model (pre-trained on COCO dataset)
model = YOLO("yolov8n.pt") # Using the "nano" model (fast & lightweight)
#apply smoothing using OpenCV's medianBlur
def smooth_image(image):
image = np.array(image) # Convert PIL image to NumPy array
smoothed = cv2.medianBlur(image, 15) # Apply median blur with kernel size 5
return Image.fromarray(smoothed) # Convert back to PIL image
#apply Erosion Morphological Transformation
def erode_image(image):
image = np.array(image)
kernel = np.ones((3, 3), np.uint8) # Define a 3x3 kernel
eroded = cv2.erode(image, kernel, iterations=1) # Apply erosion
return Image.fromarray(eroded) # Convert back to PIL image
#apply image segmentation using Otsu's Thresholding
def segment_image(image):
image = np.array(image)
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) # Convert to grayscale
_, segmented = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # Apply Otsu's thresholding
return Image.fromarray(segmented) # Convert back to PIL image
#apply Fourier Transform and display magnitude spectrum
def fourier_transform(image):
image = np.array(image)
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) # Convert to grayscale
dft = np.fft.fft2(gray) # Compute Fourier Transform
dft_shift = np.fft.fftshift(dft) # Shift zero frequency to center
magnitude_spectrum = 20 * np.log(np.abs(dft_shift) + 1) # Compute magnitude spectrum
magnitude_spectrum = np.uint8(255 * (magnitude_spectrum / np.max(magnitude_spectrum))) # Normalize for display
return Image.fromarray(magnitude_spectrum)
def detect_objects(image):
image = np.array(image) # Convert PIL image to NumPy array
# Perform object detection
results = model(image)
# Process detections
for result in results:
boxes = result.boxes.xyxy # Bounding boxes (x1, y1, x2, y2)
confidences = result.boxes.conf # Confidence scores
class_ids = result.boxes.cls.int().tolist() # Class labels
for box, conf, class_id in zip(boxes, confidences, class_ids):
x1, y1, x2, y2 = map(int, box.tolist())
label = f"{model.names[class_id]} ({conf:.2f})"
# Draw bounding box & label
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
return Image.fromarray(image) # Convert back to PIL Image for Gradio
def create_interface():
with gr.Blocks() as demo:
with gr.Row():
with gr.Column():
image_input = gr.Image(label="Upload Image", type="pil")
with gr.Column():
output_image = gr.Image(label="Processed Image", type="pil")
with gr.Row():
smoothing_button = gr.Button("Smoothing/ Blurring")
morphological_transform_button = gr.Button("Morphological Transformations")
fourier_transform_button = gr.Button("Fourier Transform")
segmentation_button = gr.Button("Segmentation")
object_recognition_button = gr.Button("Object Recognition (YOLO)")
# Link buttons to their respective functions
smoothing_button.click(smooth_image, inputs=image_input, outputs=output_image)
morphological_transform_button.click(erode_image, inputs=image_input, outputs=output_image)
fourier_transform_button.click(fourier_transform, inputs=image_input, outputs=output_image)
segmentation_button.click(segment_image, inputs=image_input, outputs=output_image)
object_recognition_button.click(detect_objects, inputs=image_input, outputs=output_image)
return demo
# Launch the Gradio app
app = create_interface()
app.launch()
|