我有两个栅格。第一个对应于云掩模,即当像素对应于云时为1的图像,而当对应于云时为0。第二个是阴影遮罩,如果像素被分类为阴影则为1,否则为0.
为了减少与阴影分类相关的错误,可以使用阴影必须与云相关联的事实;在某个方向上每个云的x米内必须有一个阴影(可以通过太阳角度来检索)。
有关如何实施此关联步骤的任何想法?
以下是原始图像的快照,云蒙版(白色)和阴影蒙版(黑色)
答案 0 :(得分:1)
我已经看到这是通过队列完成的。基本上伪代码看起来像:
points = new list()
queue = new queue()
for x,y in image_coordinates:
if is_cloud(x,y):
point = new point(x=x, y=y, distance=0, cloud_x=x, cloud_y=y)
queue.push(point)
else:
point = new point(x=x, y=y, distance=null, could_x=null, cloud_y=null)
points.push(point)
while(!queue.is_empty()):
point = queue.pop()
for neighbor in point.neighbors():
if angle_is_correct(point.cloud_x, point.cloud_y, neighbor.point.x, neighbor.point.y):
if neighbor.is_direct(): //N,S,E,W
new_distance = point.distance + 1
else: //NE, SE, SW, NW
new_distance = point.distance + SQRT_2
if neighbor.point.distance == null or neighbor.point.distance > new_distance:
neighbor.point.distance = new_distance
neighbor.point.cloud_x = point.cloud_x
neighbor.point.cloud_y = point.cloud_y
queue.push(neighbor.point)
当跑步结束时,点将是x,y坐标列表,它们到最近的云的距离,以及最近的云的x,y坐标(您可能不需要)。您应该使用angle_is_correct
函数确保仅考虑方向正确的云。如果距离超过最大距离,您也可以进一步优化它以停止向队列添加点。
我不完全确定算法的复杂性,但我怀疑有人可以设计证明这是O(n)或O(log(n))。我所知道的是,当我需要它时,它对我很有用。