【发布时间】:2016-08-26 10:15:07
【问题描述】:
首先,请注意,此问题与以下问题不重复: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 来检查中心周围的矩形区域中的每个可能的像素,如果它确实或不落在圆的圆周上,则略大于圆的直径。但是随着圈子的扩大,一直重复它会很慢。
有什么可以做得更好的吗?任何人都可以帮助我改善这一点吗?我根本不坚持我的解决方案中的任何内容,并且会接受任何其他解决方案,只要它提供所需的结果 => 让我读取 all 的值(或绝大多数 - 95具有给定中心和半径的圆的圆周上的 %+) 个像素。越快越好……
【问题讨论】:
-
一定要画圆吗??你没有!让别人画,你数像素;如果您不相信其他人,那么有几种方法可以做到这一点
-
@gpasch 我不需要画它,不......我这样做只是为了测试方法。
-
是否需要分别对待每一个圆(r=60,r=61,r=62...)圆周?
-
@MBo 是的,我愿意。我需要判断半径的各种迭代之间像素强度的变化
-
只是一个愚蠢的想法,但如果我理解正确,你必须检查所有像素的像素强度,所以你为什么不遍历所有像素并检查它们应该是哪个圆圈?保存结果(是的,这差不多,我知道),然后按圆半径排序。不知道这是否可行,只是一个想法。
标签: algorithm delphi opencv math image-processing