Сравнение пикселей по пикселям будет трудно превзойти. Вы можете значительно улучшить скорость поиска на зеленой линии, используя метод «разделяй и властвуй».
Если ширина изображения равна 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))
) для красного пикселя.
Мне нравится идея par, однако, если две точки всегда находятся на одном и том же расстоянии от центра изображения, тогда вы можете просто искать пиксели, которые падают вдоль окружности этого радиуса!