Прежде всего, обратите внимание, что этот вопрос не является дубликатом: 1st, 2nd и 3rd.Координаты каждой точки по окружности окружности
Я использую delphi и openCV, но я ищу алгоритм, решение, независимо от языка.
Для точного анализа изображения мне необходимо проверить изменения интенсивности пикселей в круговых областях. Поэтому я читаю значения пикселей по окружности непрерывно растущего круга. Чтобы это сделать, я, конечно, должен знать координаты пикселей.
Лучшее решение я нашел y:= Round(centerY + radius * sin(angle)), x:= Round(centerX + radius * cos(angle))
, а потому, что отсчет только 360 градусов вряд ли достаточно, если радиус окружности больше, чем около 60px, то угол подсчитываются как это angle:= angle + (360/(2 * 3.14 * currentRadius))
-> Я несутся через каждый значение от 0 до 360, в то время как значение увеличивается на долю 360/окружность круга в пикселях. Но этот подход не очень точен. Чем больше круг, тем меньше должна быть доля угла, и прецессия страдает от неточности Pi, плюс округление.
Если я использую упомянутый метод, и попытаться сделать подсчитанные пикселей с этим кодом:
centerX:= 1700;
centerY:= 1200;
maxRadius:= 500;
for currentRadius:= 80 to maxRadius do
begin
angle:= 0;
while angle < 360 do
begin
xI:= Round(centerX + currentRadius * cos(angle));
yI:= Round(centerY + currentRadius * sin(angle));
angle:= angle + (360/(2 * 3.14 * currentRadius));
//this is openCV function, to test the code, you can use anything, that will draw a dot...
cvLine(image,cvPoint(xI,yI),cvPoint(xI,yI),CV_RGB(0, 255, 0));
end;
end;
результат заключается в следующем:
Это не плохо, но, принимая во внимание, что ровно треть всех пикселей в круговой области черные, вы понимаете, что много пикселей было «пропущено». Плюс, внимательно глядя на край последнего круга, ясно видно, что некоторые точки с фактической окружности - еще один результат погрешности ...
Возможно, я мог бы использовать формулу (x - xorig)^2 + (y - yorig)^2 = r^2
, чтобы проверить каждый возможный пиксель в прямоугольная область вокруг центра, немного больше, чем диаметр круга, если это так, или не падает на окружность царя. Но это было бы очень медленно повторять все это время, когда круг растет.
Есть ли что-то, что можно было бы сделать лучше? Может ли кто-нибудь помочь мне улучшить это? Я вообще не настаиваю на чем-либо от своего решения и соглашусь с любым другим решением, если оно дает желаемые результаты => Позвольте мне прочитать значения все (или подавляющее большинство - 95% +) пикселей на окружность окружности с заданным центром и радиусом. Чем быстрее, тем лучше ...
вам нужно нарисовать круг? вы не делаете! пусть кто-то еще делает рисунок, и вы считаете пиксели; если вы не доверяете кому-то другому, тогда есть несколько способов сделать это – gpasch
@gpasch Мне не нужно рисовать, нет ...Я сделал это, чтобы проверить подход. –
Вам нужно обрабатывать каждую окружность (r = 60, r = 61, r = 62 ...) отдельно? – MBo