我想从给定的图像中提取点。图像如下所示..
我想要的点是绿色上点和红点。我尝试逐像素比较,但它太慢了。我需要一个更好的算法。你有什么建议吗?
答案 0 :(得分:3)
如果点总是位于距离中心的已知半径处,那么您可以检查位于圆周上的点。
答案 1 :(得分:1)
逐像素比较将难以击败。通过使用分而治之的方法,您可以大大提高绿线上的搜索速度。
如果图片宽度为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}
{{1}如果p
位于左下方,则{px,py-1},{px-1,py}
位于p
,如果{px,py+1},{px-1,py}
位于左上角,则p
位于{px,py-1},{px+1,py}
位于左上方,p
位于{ {1}}位于右下方。更新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)
便宜,因为提高搜索单个红色像素的成本的唯一方法是对图像进行二次采样({{1} })然后在整个图像(现在O(x*y)
)中搜索红色像素。
我喜欢par的想法,但是,如果这两个点距离图像中心的距离总是相同的话,那么你可以只搜索落在该半径圆周上的像素!