Python 自定义多边形图像布尔掩码

Python 自定义多边形图像布尔掩码,python,image,masking,Python,Image,Masking,我在制定一个问题的解决方案时遇到了困难,我真的不知道要搜索的正确关键字,所以我来这里寻求帮助 我有一张天文学图像,上面有恒星映射到图像上,基本上就是说我有一张图像,图像上有一组点随机分布在上面,有x和y像素坐标。唯一的问题是,这些“恒星”中的一些只是糟糕的探测结果,我们试图过滤掉它们,同时保留好的点,结果却缺乏光泽。这些点来自坏像素列或前景星,它们使成像仪饱和 然后,我希望能够手动进入图像,指定由坐标绑定的形状,以排除这些区域中的任何点。例如,我有一个放大的衍射尖峰星,我想在它周围放一些方形的星

我在制定一个问题的解决方案时遇到了困难,我真的不知道要搜索的正确关键字,所以我来这里寻求帮助

我有一张天文学图像,上面有恒星映射到图像上,基本上就是说我有一张图像,图像上有一组点随机分布在上面,有x和y像素坐标。唯一的问题是,这些“恒星”中的一些只是糟糕的探测结果,我们试图过滤掉它们,同时保留好的点,结果却缺乏光泽。这些点来自坏像素列或前景星,它们使成像仪饱和

然后,我希望能够手动进入图像,指定由坐标绑定的形状,以排除这些区域中的任何点。例如,我有一个放大的衍射尖峰星,我想在它周围放一些方形的星。另一个是一些倾斜的坏柱,我想排除它,所以我想在它周围放一个菱形,排除其中所有的坏点

这相当于我希望能够在给定一组连接点的情况下形成某种多边形遮罩,并能够将其应用于图像,然后在图像中排除这些点

只是做了一些头脑风暴,并试图在互联网上找到一些东西,我有一个想法,使某种自定义多边形对象,可以应用于所有的点,从而减少了坏点一次一个形状


唯一的问题是我很难想象我会怎么做。有没有什么好的资源或建议来实现这样一个面具?另外,对于我想要实现的目标,有没有更好的方法呢?

这个问题非常适合多边形中的调用点。通过一些研究,我掌握了一种算法,该算法基本上采用一个简单的多边形,并找到与点右侧任何边的交点。如果碰撞次数为偶数,则该点位于多边形外部,反之亦然,如果碰撞次数为奇数;这被称为奇偶规则。虽然有一些局限性,但由于在点位置上具有高度的准确性,这是非常成功的

这里有一个链接,指向我在这个问题空间中发现的两个最常用算法的有用来源:

下面是我最终提出的在Python中应用该算法的解决方案(希望它能帮助其他人):

class Polygon():
"""
制作一些带有边和顶点的多边形。
"""
定义初始值(自身,点):
"""
获取指定每个顶点的元组点列表。
"""
##用边列表构建多边形
self.edges=[]
对于范围内的i(len(点)):
如果(i)<(len(点)-1)):
#用i到len-2的顶点构造
vi=顶点(点[i][0],点[i][1])
vj=顶点(点[i+1][0],点[i+1][1])
e_电流=边缘(vi,vj)
self.edges.append(e_当前)
其他:
#构造连接回起点的最后一个顶点
vi=顶点(点[i][0],点[i][1])
vj=顶点(点[0][0],点[0][1])
e_电流=边缘(vi,vj)
self.edges.append(e_当前)
def isInside(自身,P):
"""
获取一个元组P,并查看该点是否位于多边形实例内。
"""
P=顶点(P[0],P[1])
碰撞=0
对于自边中的e:

如果((e.getStartPoint().y P.y))或((e.getStartPoint().y>P.y)和(e.getEndPoint()).y Numpy具有遮罩功能。但我认为您甚至不需要它们。如果我理解正确,您可以将图像的部分设置为零。如果字段没有更改,您可以通过编程方式进行设置。如果孔径为正方形,您甚至可以使用
aa[13:20,33:40]中的
切片操作=0
其中
aa
是数组。如果要通过单击像素以交互方式执行此操作,请查找自定义事件处理程序()谢谢你的评论。事实上,我也有同样的想法,如果我能以交互方式来做这件事会很酷,但不幸的是,我现在无法投入时间来做类似的事情。可能不够清楚的是,我的点集有X,Y点对应于图像,但它们彼此独立。我这是一种叫做“多边形中的点”的技术,它给了我所需要的东西,我在写这篇文章的时候正在实现它。
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) + ")"