Я понимаю, что есть инструменты с открытым исходным кодом, которые уже делают это, но предположим, что мы хотим написать наш собственный код.
Предположим, что входные данные для нашей программы представляют собой 2D-изображение на сплошном фоне, например:
![blob on grey background](https://i.stack.imgur.com/C65R9m.png)
Как мыимпортировать изображение и преобразовать его в оттенки серого?
Далее, предположим, что мы запускаем луч (показан красным) из верхнего края изображения, спускаясь вниз по столбцу пикселей.
![ray tracing picture](https://i.stack.imgur.com/fb7FSm.png)
Мы рассмотрим дискретную функцию, описывающую цвет пикселя как функцию расстояния от начала / начала луча.
![plot of color over distance from start of ray](https://i.stack.imgur.com/vMOHlm.png)
Как мы подгоняем плавную кривую ко второй производной? То есть мы хотим посмотреть, насколько быстро ускоряется цвет.
Я думаю, что локальный максимум ускорения (вторая производная) будет там, где, скажем, edge
фигуры. В качестве альтернативы, возможно, локальный максимум в скорости цвета. Мы хотим попытаться найти локальный максимум, ближайший к началу / началу луча. Я думал о подборе синусоидальной формы, за исключением того, что вместо минимизации суммы квадратов ошибок по всему лучу я хочу лишь минимизировать сумму квадратов ошибок около «начала» луча. Тем не менее, другие предложения приветствуются.
Мы запускаем луч из:
- каждого пикселя по верхнему / северному краю
- каждого пикселя по западному краю
- каждого пикселя поюжный край
- каждый пиксель на восточном краю.
Итак, если изображение m
на n
, то мы получаем всего 2*(m+n)
лучей.
Для каждого луча мы находим первый локальный максимум в ускорении изменения цвета.
Как мы пишем код для этого на python?
Когда я говорюмы пишем наш «собственный код», я не имею в виду все. Можно использовать сторонний инструмент, чтобы выполнить регрессию для каждого луча, чтобы найти локальный максимум в ускорении (или, возможно, это локальный максимум в скорости). Тем не менее, мы хотим написать наш собственный код для запуска лучей и т.д ...
В конце вывод нашего скрипта Python должен быть структурой данных, имеющей метод __getitem__
, который записывает, как далекоЛуч должен пройти от края изображения до того, как он достигнет первого цветного пикселя «без фона».
![picture of final product](https://i.stack.imgur.com/5Rjmvm.png)
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