自定义多边形图像布尔蒙版

时间:2016-03-23 06:04:50

标签: python image masking

我在制定问题解决方案时遇到问题,而且我真的不知道要搜索的关键字,所以我来这里寻求帮助。

我有一个星图映射到图像的天文图像,这实际上是说我有一些图像,其中一组点随机分布在x和y像素坐标上。唯一的问题是其中一些"明星"只是糟糕的检测和我们试图过滤它们,同时保持好点,因为产生缺乏光泽的结果。这些点来自坏像素列或使成像器饱和的前景星。

我希望能够手动进入图像,指定由坐标限定的形状,这些坐标将排除这些区域中的任何点。例如,我有一些大爆炸的衍射尖峰星,我想在它周围放置某种四四方方的星。另一个是我想要排除的一些倾斜的坏列,所以我想在它周围放一个菱形并排除其中的所有坏点。

这等于我希望能够在给定一组连接点的情况下形成某种多边形蒙版,并且能够将其应用于图像,然后将其排除在内。

只是做了一些脑力激荡并试图在互联网上找到一些东西,我想到了制作某种自定义多边形对象,它可以应用于所有点,从而一次摆弄一个形状的坏点。

唯一的问题是我很难想象我会怎么做。实施这样的面具有什么好的资源或建议吗?那么,对于我想要实现的目标,是否有更好的技术?

1 个答案:

答案 0 :(得分:0)

这个问题完全适用于调用点多边形的东西。一些研究我得到了一个算法,它基本上采用一个简单的多边形,并找到与点右边任何边的交点。如果存在偶数个碰撞,那么该点在多边形之外,反之亦然,用于奇数次碰撞;这被称为偶数规则。有一些限制,但在点位置具有高度准确性,它非常成功。

以下链接指向此问题空间中最常用的两种算法的有用资源: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) + ")"