Я рассчитал величину и направление градиента Собеля. Но я застрял на том, как использовать это далее для определения формы.
Изображение> Оттенки серого> Фильтр Собела> Градиент Собела и вычисленное направление> далее?
Используются ядра Собеля:
Kx = ([[1, 0, -1],[2, 0, -2],[1, 0, -1]])
Ky = ([[1, 2, 1],[0, 0, 0],[-1, -2, -1]])
(У меня есть ограничение на использование только Numpy и никакой другой библиотеки с языком Python.)
import numpy as np
def classify(im):
#Convert to grayscale
gray = convert_to_grayscale(im/255.)
#Sobel kernels as numpy arrays
Kx = np.array([[1, 0, -1],[2, 0, -2],[1, 0, -1]])
Ky = np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]])
Gx = filter_2d(gray, Kx)
Gy = filter_2d(gray, Ky)
G = np.sqrt(Gx**2+Gy**2)
G_direction = np.arctan2(Gy, Gx)
#labels = ['brick', 'ball', 'cylinder']
#Let's guess randomly! Maybe we'll get lucky.
#random_integer = np.random.randint(low = 0, high = 3)
return labels[random_integer]
def filter_2d(im, kernel):
'''
Filter an image by taking the dot product of each
image neighborhood with the kernel matrix.
'''
M = kernel.shape[0]
N = kernel.shape[1]
H = im.shape[0]
W = im.shape[1]
filtered_image = np.zeros((H-M+1, W-N+1), dtype = 'float64')
for i in range(filtered_image.shape[0]):
for j in range(filtered_image.shape[1]):
image_patch = im[i:i+M, j:j+N]
filtered_image[i, j] = np.sum(np.multiply(image_patch, kernel))
return filtered_image
def convert_to_grayscale(im):
'''
Convert color image to grayscale.
'''
return np.mean(im, axis = 2)