Я понимаю, что есть инструменты с открытым исходным кодом, которые уже делают это, но предположим, что мы хотим написать наш собственный код.
Предположим, что входные данные для нашей программы представляют собой 2D-изображение на сплошном фоне, например:
Как мыимпортировать изображение и преобразовать его в оттенки серого?
Далее, предположим, что мы запускаем луч (показан красным) из верхнего края изображения, спускаясь вниз по столбцу пикселей.
Мы рассмотрим дискретную функцию, описывающую цвет пикселя как функцию расстояния от начала / начала луча.
Как мы подгоняем плавную кривую ко второй производной? То есть мы хотим посмотреть, насколько быстро ускоряется цвет.
Я думаю, что локальный максимум ускорения (вторая производная) будет там, где, скажем, edge
фигуры. В качестве альтернативы, возможно, локальный максимум в скорости цвета. Мы хотим попытаться найти локальный максимум, ближайший к началу / началу луча. Я думал о подборе синусоидальной формы, за исключением того, что вместо минимизации суммы квадратов ошибок по всему лучу я хочу лишь минимизировать сумму квадратов ошибок около «начала» луча. Тем не менее, другие предложения приветствуются.
Мы запускаем луч из:
- каждого пикселя по верхнему / северному краю
- каждого пикселя по западному краю
- каждого пикселя поюжный край
- каждый пиксель на восточном краю.
Итак, если изображение m
на n
, то мы получаем всего 2*(m+n)
лучей.
Для каждого луча мы находим первый локальный максимум в ускорении изменения цвета.
Как мы пишем код для этого на python?
Когда я говорюмы пишем наш «собственный код», я не имею в виду все. Можно использовать сторонний инструмент, чтобы выполнить регрессию для каждого луча, чтобы найти локальный максимум в ускорении (или, возможно, это локальный максимум в скорости). Тем не менее, мы хотим написать наш собственный код для запуска лучей и т.д ...
В конце вывод нашего скрипта Python должен быть структурой данных, имеющей метод __getitem__
, который записывает, как далекоЛуч должен пройти от края изображения до того, как он достигнет первого цветного пикселя «без фона».
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