Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import cv2 | |
| from scipy import signal as sig | |
| import numpy as np | |
| from scipy.ndimage.filters import convolve | |
| def gradient_x(imggray): | |
| ##Sobel operator kernels. | |
| kernel_x = np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]]) | |
| return sig.convolve2d(imggray, kernel_x, mode='same') | |
| def gradient_y(imggray): | |
| kernel_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]]) | |
| return sig.convolve2d(imggray, kernel_y, mode='same') | |
| def gaussian_kernel(size, sigma=1): | |
| size = int(size) // 2 | |
| x, y = np.mgrid[-size:size+1, -size:size+1] | |
| normal = 1 / (2.0 * np.pi * sigma**2) | |
| g = np.exp(-((x**2 + y**2) / (2.0*sigma**2))) * normal | |
| return g | |
| def harris(img): | |
| img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| I_x = gradient_x(img_gray) | |
| I_y = gradient_y(img_gray) | |
| Ixx = convolve(I_x**2, gaussian_kernel(3, 1)) | |
| Ixy = convolve(I_y*I_x, gaussian_kernel(3, 1)) | |
| Iyy = convolve(I_y**2, gaussian_kernel(3, 1)) | |
| k = 0.05 | |
| # determinant | |
| detA = Ixx * Iyy - Ixy ** 2 | |
| # trace | |
| traceA = Ixx + Iyy | |
| harris_response = detA - k * traceA ** 2 | |
| window_size = 3 | |
| offset = window_size//2 | |
| width, height = img_gray.shape | |
| for y in range(offset, height-offset): | |
| for x in range(offset, width-offset): | |
| Sxx = np.sum(Ixx[y-offset:y+1+offset, x-offset:x+1+offset]) | |
| Syy = np.sum(Iyy[y-offset:y+1+offset, x-offset:x+1+offset]) | |
| Sxy = np.sum(Ixy[y-offset:y+1+offset, x-offset:x+1+offset]) | |
| det = (Sxx * Syy) - (Sxy**2) | |
| trace = Sxx + Syy | |
| r = det - k*(trace**2) | |
| img_copy_for_corners = np.copy(img) | |
| img_copy_for_edges = np.copy(img) | |
| for rowindex, response in enumerate(harris_response): | |
| for colindex, r in enumerate(response): | |
| if r > 0: | |
| # this is a corner | |
| img_copy_for_corners[rowindex, colindex] = [255,0,0] | |
| elif r < 0: | |
| # this is an edge | |
| img_copy_for_edges[rowindex, colindex] = [0,255,0] | |
| return img_copy_for_corners | |
| interface = gr.Interface( | |
| title = "Harris Corner Detector ๐ค", | |
| description = "<h3>The idea is to locate interest points where the surrounding neighbourhood shows edges in more than one direction.</h3> <br> <b>Select an image ๐ผ</b>", | |
| article='Step-by-step on GitHub <a href="https://github.com/Ivanrs297/machine-learning-projects/blob/main/computer-vision/edge_detection/main.ipynb"> notebook </a> <br> ~ Ivanrs', | |
| allow_flagging = "never", | |
| fn = harris, | |
| inputs = [ | |
| gr.Image(), | |
| ], | |
| outputs = "image" | |
| ) | |
| interface.launch(share = False) |