Пиксельное сравнение будет трудно победить.Вы можете значительно повысить скорость поиска по зеленой линии, используя метод «разделяй и властвуй».
Если ширина изображения x
, а его высота y
, выполните поиск по всем пикселям, расположенным вx={0...x},y={y/4,3*y/4}
за зеленый пиксель.Если ничего не найдено, ищите все пиксели вдоль x={x/4,3*x/4},y={0...y}
.Как только вы найдете зеленый пиксель p
в координатах px,py
, выполните поиск двухпиксельной окрестности этого пикселя, которая находится дальше от центра изображения (то есть {px,py+1},{px+1,py}
, если p
находится в верхнем правом углу,{px,py-1},{px-1,py}
, если p
в левом нижнем углу, {px,py+1},{px-1,py}
, если p
в верхнем левом углу, или {px,py-1},{px+1,py}
, если p
в нижнем правом квадранте. Обновите p
, чтобы он стал первым зеленымВы найдете соседа. Итерируйте, пока у p
больше не будет зеленых соседей. В худшем случае этот алгоритм будет ~O(2*(x+y)+(1/2)*max(x,y)) ~= O(2.5*max(x,y)) ~= O(x)
, что намного лучше, чем O(x*y)
, если вы просто проверяете значение цвета каждой пары {x,y}
.
Поиск красной точки будет дорогостоящим, но не менее дорогим, чем O(x*y)
, поскольку единственный способ повысить стоимость поиска одного красного пикселя будет путем подвыборки изображения (O(x*y)
) изатем поиск всего изображения (теперь O(sqrt(x*y))
) для красного пикселя.
Мне нравится идея пар, хотя, если две точки всегда находятся на одинаковом расстоянии от центра изображения, вы можете просто искатьпикселей, которыеупасть по окружности этого радиуса!