我想从给定的图像中提取点。图像如下所示..
我想要的点是绿色的上点和红色的点。我尝试逐像素比较,但它太慢了。我需要一个更好的算法。你有什么建议?
我想从给定的图像中提取点。图像如下所示..
我想要的点是绿色的上点和红色的点。我尝试逐像素比较,但它太慢了。我需要一个更好的算法。你有什么建议?
如果这些点始终位于距中心的已知半径处,那么您只需检查位于圆周上的点即可。
逐像素比较将很难被击败。通过使用分而治之的方法,您可以大大提高您在绿线上的搜索速度。
如果图像宽度为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 的想法,如果两个点与图像中心的距离始终相同,那么您只需搜索沿该半径圆周落下的像素!