Я пытаюсь создать случайный тест для реализации функции harris_corner_detector (ОЧЕНЬ ОБЩЕ И НЕМНОГО НЕПРАВИЛЬНО: функция, которая находит углы в изображении). В тесте я хочу создать случайные простые формы в двоичной матрице numpy (это легко знать координаты их углов) (например, прямоугольники, треугольники, ромб (ромб) и т. д.) и проверить, находит ли реализация Харриса правильные углы.
Я уже реализовал функцию, которая случайным образом «рисует» прямоугольник, параллельный оси, но я не могу найти эффективный способ сделать это, когда речь идет о фигурах, которые не параллельны осям.
Чтобы создать случайный прямоугольник, я случайным образом выбираю начальную и конечную точки на обеих осях и изменяю значение всех ячеек в пределах этих границ следующим образом:
получение случайных координат:
def _get_random_coords(self, start, end):
x_start, y_start = np.random.randint(start, end, 2)
x_end = np.random.randint(x_start + 7, end + 20)
y_end = np.random.randint(y_start + 7, end + 20)
return (x_start, x_end, y_start, y_end)
рисование случайного прямоугольника (значения 255 для фона и 0 для фигуры):
mat = np.ones((1024, 1024)) * 255
mat[x_start: x_end, y_start: y_end] = np.zeros((x_end - x_start, y_end - y_start))
но когда дело доходит до эффективного рисования ромбовидной формы, я теряюсь. Все, о чем я могу думать, это запустить цикл, который создает ромб следующим образом:
def _get_rhombus(self, size):
rhombus = []
for i in range(size):
rhombus.append(np.zeros(i+1))
for i in range(size - 1, 0, -1):
rhombus.append(np.zeros(i))
return np.array(rhombus)
а затем еще один цикл, чтобы добавить его к большей матрице. Но этот метод крайне неэффективен, когда дело доходит до тестирования (поскольку я нарисую их сотни, некоторые из них могут быть огромными).
Есть идеи получше? В качестве альтернативы - есть ли лучший способ проверить это?
Заранее спасибо.