2016-03-23 2 views
0

У меня возникли проблемы с формулировкой решения проблемы, и я действительно не знаю правильных ключевых слов для поиска, поэтому я прихожу сюда за помощью.Custom Polygon Image Boolean Mask

У меня есть изображение астрономии, которое имеет звезды, сопоставленные с изображением, что по существу говорит, что у меня есть изображение с набором точек, случайно распределенных по нему с координатами x и y пикселей. Единственная проблема заключается в том, что некоторые из этих «звезд» - это просто плохие обнаружения, и наши попытки отфильтровать их, а также сохранять хорошие моменты, так как не дают результатов блеска. Эти точки исходят из плохих столбцов пикселей или звезд переднего плана, которые насыщают тепловизор.

Я хочу, чтобы затем я смог заглянуть в изображение вручную, указав формы, связанные координатами, которые исключат любые точки из этих областей. Например, у меня есть какая-то большая взорванная дифракционная звездочка, которую я хочу поместить вокруг нее какую-то квадратную звезду. Другой - некоторый наклонный плохой столбец, который я хочу исключить, поэтому я хочу поставить вокруг него ромб и исключить все плохие точки внутри него.

Это равносильно тому, что я хочу создать какую-то многоугольную маску, заданную набором точек соединения, и иметь возможность применить это к изображению, где оно будет исключать те точки внутри.

Просто сделав некоторый мозговой штурм и попытавшись найти что-то в Интернете, я подумал о том, чтобы создать какой-то пользовательский объект полигона, который может быть применен ко всем точкам, что, таким образом, уменьшает плохие точки на одной фигуре за раз.

Единственная проблема - мне трудно представить, как я это сделаю. Есть ли хорошие ресурсы или советы для реализации такой маски? Иначе, есть ли лучшая техника для того, чего я пытаюсь достичь?

+0

Numpy имеет маскирующие особенности. Но я не думаю, что они вам даже нужны. Вы могли бы просто установить части вашего изображения на ноль, если я правильно понял вас. Если поле не изменяется, вы можете сделать это программно. Если апараты квадратные, вы можете даже использовать операции 'slicing', как в' aa [13:20, 33:40] = 0', где 'aa' - ваш массив. Если вы хотите сделать это интерактивно, нажав на пиксели, найдите пользовательские обработчики событий (http://matplotlib.org/users/event_handling.html) – roadrunner66

+0

Благодарим вас за комментарий. У меня была та же идея, что было бы здорово, если бы я мог сделать это в интерактивном режиме, но, к сожалению, сейчас я не могу сказать что-то подобное. Что, может быть, недостаточно ясно, так это то, что мой набор точек имеет точки X, Y, соответствующие изображению, но отличные от того, что они независимы друг от друга. Я нашел метод, называемый point-in-polygon, который дает мне именно то, что мне нужно, и я нахожусь во время написания этого в настоящее время. – Tristan

ответ

0

Эта проблема называется идеально для чего-то вызывать point-in-polygon. В некоторых исследованиях я получил алгоритм, который по существу берет простой многоугольник и находит пересечение с любыми ребрами справа от точки. Если существует четное число столкновений, то точка находится за пределами многоугольника и наоборот для нечетного числа столкновений; это называется четно-нечетным правилом. Есть некоторые ограничения, но с высокой степенью точности в позициях позиций это очень успешно.

Вот ссылка на полезный источник, который я нашел на двух наиболее используемых алгоритмах в этом проблемном пространстве: point-in-polygon.

Вот решение, я в конечном итоге придумывают применить алгоритм в Python (надеюсь, что это может помочь другим):

class Polygon(): 
""" 
Make some polygon with edges and vertices. 
""" 
def __init__(self, points): 
    """ 
    Takes in list of tuple points specifying each vertex. 
    """ 

    ## Build polygon rith a list of edges 
    self.edges = [] 
    for i in range(len(points)): 
     if(i < (len(points) - 1)): 
      # construct with the vertices of i to len - 2 
      vi = Vertex(points[i][0], points[i][1]) 
      vj = Vertex(points[i+1][0], points[i+1][1]) 
      e_current = Edge(vi, vj) 
      self.edges.append(e_current) 
     else: 
      # construct last vertex that connects back to beginning 
      vi = Vertex(points[i][0], points[i][1]) 
      vj = Vertex(points[0][0], points[0][1]) 
      e_current = Edge(vi, vj) 
      self.edges.append(e_current) 


def isInside(self, P): 
    """ 
    Takes in a tuple P and sees if this point is inside the instance of polygon. 
    """ 
    P = Vertex(P[0], P[1]) 
    collisions = 0 
    for e in self.edges: 
     if(((e.getStartPoint().y <= P.y) and (e.getEndPoint().y > P.y)) or ((e.getStartPoint().y > P.y) and (e.getEndPoint().y <= P.y))): 
      vt = 1.0 * (P.y - e.getStartPoint().y)/(e.getEndPoint().y - e.getStartPoint().y) 
      if(P.x < e.getStartPoint().x + vt * (e.getEndPoint().x - e.getStartPoint().x)): 
       collisions += 1 

    if collisions % 2 == 1: 
     return True 
    else: 
     return False 


def getSize(self): 
    return len(self.edges) 


def toString(self): 
    string = "" 
    for e in self.edges: 
     string += (e.toString() + "\n") 
    return string 

class Edge(): 
""" 
Consruct an edge from two vertices vi, vj. 
""" 
def __init__(self, vi, vj): 
    self.vi = vi 
    self.vj = vj 

def getStartPoint(self): 
    return self.vi 


def getEndPoint(self): 
    return self.vj 

def toString(self): 
    return "Edge from " + self.vi.toString() + " to " + self.vj.toString() + "." 

class Vertex(): 
""" 
Construct a vertex out of x and y coordinates 
""" 
def __init__(self, x, y): 
    self.x = x 
    self.y = y 

def toString(self): 
    return "(" + str(self.x) + ", " + str(self.y) + ")"