自定义多边形图像布尔遮罩
Custom Polygon Image Boolean Mask
我在制定问题的解决方案时遇到困难,而且我真的不知道要搜索的正确关键字,所以我来这里寻求帮助。
我有一张天文图像,上面有星星映射到图像上,这实际上是说我有一些图像,其中一组点随机散布在图像上,x 和 y 像素坐标。唯一的问题是其中一些 "stars" 只是错误的检测,我们试图将它们过滤掉,同时保留好的点,因为结果缺乏光泽。这些点来自使成像器饱和的不良像素列或前景恒星。
然后我希望能够手动进入图像并指定由坐标绑定的形状,这些形状将排除这些区域中的任何点。例如,我有一些放大的衍射尖峰星,我想在它周围放一些四四方方的星。另一个是我想排除的一些倾斜的坏列,所以我想在它周围画一个菱形并排除其中的所有坏点。
这对我来说无异于希望能够在给定一组连接点的情况下形成某种多边形蒙版,并能够将其应用于图像,然后在图像中排除这些点。
只是做了一些头脑风暴并试图在互联网上找到一些东西,我想到了制作某种可以应用于所有点的自定义多边形对象,从而一次减少一个形状的坏点.
唯一的问题是我很难想象我会怎么做。是否有任何好的资源或建议来实施这种面具?另外,对于我想要实现的目标,是否有更好的技术?
这个问题非常适合称为多边形中的点。一些研究我掌握了一种算法,该算法本质上采用简单的多边形并找到与该点右侧的任何边缘的交点。如果碰撞次数为偶数,则该点位于多边形之外,反之亦然,碰撞次数为奇数;这称为奇偶规则。有一些局限性,但点位的准确性很高,非常成功。
这里是 link 我在这个问题中找到的两个最常用算法的有用资源 space: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) + ")"
我在制定问题的解决方案时遇到困难,而且我真的不知道要搜索的正确关键字,所以我来这里寻求帮助。
我有一张天文图像,上面有星星映射到图像上,这实际上是说我有一些图像,其中一组点随机散布在图像上,x 和 y 像素坐标。唯一的问题是其中一些 "stars" 只是错误的检测,我们试图将它们过滤掉,同时保留好的点,因为结果缺乏光泽。这些点来自使成像器饱和的不良像素列或前景恒星。
然后我希望能够手动进入图像并指定由坐标绑定的形状,这些形状将排除这些区域中的任何点。例如,我有一些放大的衍射尖峰星,我想在它周围放一些四四方方的星。另一个是我想排除的一些倾斜的坏列,所以我想在它周围画一个菱形并排除其中的所有坏点。
这对我来说无异于希望能够在给定一组连接点的情况下形成某种多边形蒙版,并能够将其应用于图像,然后在图像中排除这些点。
只是做了一些头脑风暴并试图在互联网上找到一些东西,我想到了制作某种可以应用于所有点的自定义多边形对象,从而一次减少一个形状的坏点.
唯一的问题是我很难想象我会怎么做。是否有任何好的资源或建议来实施这种面具?另外,对于我想要实现的目标,是否有更好的技术?
这个问题非常适合称为多边形中的点。一些研究我掌握了一种算法,该算法本质上采用简单的多边形并找到与该点右侧的任何边缘的交点。如果碰撞次数为偶数,则该点位于多边形之外,反之亦然,碰撞次数为奇数;这称为奇偶规则。有一些局限性,但点位的准确性很高,非常成功。
这里是 link 我在这个问题中找到的两个最常用算法的有用资源 space: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) + ")"