Как я могу написать свой собственный код, чтобы найти край фигуры на сплошном цвете фона? - PullRequest
0 голосов
/ 07 ноября 2019

Я понимаю, что есть инструменты с открытым исходным кодом, которые уже делают это, но предположим, что мы хотим написать наш собственный код.

Предположим, что входные данные для нашей программы представляют собой 2D-изображение на сплошном фоне, например:

blob on grey background

Как мыимпортировать изображение и преобразовать его в оттенки серого?

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

ray tracing picture

Мы рассмотрим дискретную функцию, описывающую цвет пикселя как функцию расстояния от начала / начала луча.

plot of color over distance from start of ray

Как мы подгоняем плавную кривую ко второй производной? То есть мы хотим посмотреть, насколько быстро ускоряется цвет.

Я думаю, что локальный максимум ускорения (вторая производная) будет там, где, скажем, edge фигуры. В качестве альтернативы, возможно, локальный максимум в скорости цвета. Мы хотим попытаться найти локальный максимум, ближайший к началу / началу луча. Я думал о подборе синусоидальной формы, за исключением того, что вместо минимизации суммы квадратов ошибок по всему лучу я хочу лишь минимизировать сумму квадратов ошибок около «начала» луча. Тем не менее, другие предложения приветствуются.

Мы запускаем луч из:

  • каждого пикселя по верхнему / северному краю
  • каждого пикселя по западному краю
  • каждого пикселя поюжный край
  • каждый пиксель на восточном краю.

Итак, если изображение m на n, то мы получаем всего 2*(m+n) лучей.

Для каждого луча мы находим первый локальный максимум в ускорении изменения цвета.

Как мы пишем код для этого на python?

Когда я говорюмы пишем наш «собственный код», я не имею в виду все. Можно использовать сторонний инструмент, чтобы выполнить регрессию для каждого луча, чтобы найти локальный максимум в ускорении (или, возможно, это локальный максимум в скорости). Тем не менее, мы хотим написать наш собственный код для запуска лучей и т.д ...

В конце вывод нашего скрипта Python должен быть структурой данных, имеющей метод __getitem__, который записывает, как далекоЛуч должен пройти от края изображения до того, как он достигнет первого цветного пикселя «без фона».

picture of final product

reggie = RectangleBoundedImage()

    reggie[0, 0] .....
        * begin at rectangular boundary's top edge (0)
        * begin at leftmost pixel (0) on the top edge
        * traverse column of pixels in a straight
          downward direction
        * `reggie[0, 0]` is the distance
          between the top edge of the boundary
          and the image
        * `reggie[0, 0]` == 0 implies top left
          pixel of bounded region is part of
          the image
        * `reggie[0, 0] == 99` implies
          top left pixel of bounded region
          is **NOT** part of the image and
          that the first pixel of the image
          encountered while traversing downwards
          is 99 pixels from the north/top boundary
          edge.
        * reggie[0, 0] == float('inf')
          No pixel of the image exists in the leftmost
          column of the rectangular bounding region
...