2014-02-11 4 views
1

У меня есть два растра. Первый соответствует облачной маске, то есть изображению с 1, когда пиксель соответствует облаку и 0, когда он этого не делает. Вторая - теневая маска, 1, если пиксель классифицируется как тень, иначе 0.Ассоциированные тени к их источнику при анализе изображений

Чтобы уменьшить ошибку, связанную с классификацией тени, можно использовать тот факт, что тень должна быть связана с облаком; должна быть тень в пределах х метров каждого облака в определенном направлении (которое может быть получено благодаря солнечному углу).

Любые идеи о том, как реализовать этот шаг ассоциации?

Вот снимок исходного изображения, облако маска (белая) и теневая маска (черный) enter image description here

+0

Что именно вы задаёли? Вы пытаетесь создать теневую маску? Потому что это звучит так, будто вы начинаете с этого. Если нет, то что вы пытаетесь классифицировать? – Pace

+0

Что я пытаюсь сделать, чтобы связать тень с облаком, чтобы уменьшить ошибки в тени – WAF

ответ

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) 

Когда разбег законченные точки будут списком х, у координаты, их расстояние до ближайшего облака, а х, у координаты ближайшего облака (которые вам, вероятно, не нужны). Вы должны использовать функцию angle_is_correct, чтобы убедиться, что учитываете только облака, которые находятся в правильном направлении. Вы также можете продолжить оптимизацию, чтобы прекратить добавлять точки в очередь, если их расстояние превышает максимальное расстояние.

Я не совсем уверен в алгоритмической сложности, но я подозреваю, что можно было бы разработать доказательство, чтобы показать, что это O (n) или O (log (n)). Все, что я знаю, это то, что он быстро работал для меня, когда мне это нужно.