Как найти основные формы (кирпич, цилиндр, сфера) на изображении с помощью оператора Собеля? - PullRequest
0 голосов
/ 11 сентября 2018

Sample 1- Brick Sample 2- Sphere

Я рассчитал величину и направление градиента Собеля. Но я застрял на том, как использовать это далее для определения формы.

Изображение> Оттенки серого> Фильтр Собела> Градиент Собела и вычисленное направление> далее?

Используются ядра Собеля:

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)

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете использовать следующие отличительные характеристики ваших фигур:

  • кирпич имеет несколько прямых ребер (от четырех до шести, в зависимости от точки зрения);

  • сфера имеет один изогнутый край;

  • цилиндр имеет два изогнутых ребра и прямые ребра (хотя они могут быть полностью скрыты).

Используйте бинаризацию (на основе яркости и / или насыщенности) и извлеките контуры. Затем найдите прямые участки, возможно, используя алгоритм упрощения Дугласа-Пекера. Наконец, проанализируйте последовательности прямых и изогнутых ребер.


Возможный способ решения окончательной задачи классификации - представить контуры в виде цепочки кусков, прямых или изогнутых, с приблизительным указанием длины (короткая / средняя / длинная). При несовершенной сегментации каждая форма будет соответствовать набору шаблонов.

Вы можете работать с фазой обучения, чтобы выучить максимум шаблонов, а затем использовать сопоставление строк (где строки рассматриваются как циклы). Там, вероятно, будут связи для арбитража. Другой вариант - приблизительное совпадение строк.

...