我在制定问题解决方案时遇到问题,而且我真的不知道要搜索的关键字,所以我来这里寻求帮助。
我有一个星图映射到图像的天文图像,这实际上是说我有一些图像,其中一组点随机分布在x和y像素坐标上。唯一的问题是其中一些"明星"只是糟糕的检测和我们试图过滤它们,同时保持好点,因为产生缺乏光泽的结果。这些点来自坏像素列或使成像器饱和的前景星。
我希望能够手动进入图像,指定由坐标限定的形状,这些坐标将排除这些区域中的任何点。例如,我有一些大爆炸的衍射尖峰星,我想在它周围放置某种四四方方的星。另一个是我想要排除的一些倾斜的坏列,所以我想在它周围放一个菱形并排除其中的所有坏点。
这等于我希望能够在给定一组连接点的情况下形成某种多边形蒙版,并且能够将其应用于图像,然后将其排除在内。
只是做了一些脑力激荡并试图在互联网上找到一些东西,我想到了制作某种自定义多边形对象,它可以应用于所有点,从而一次摆弄一个形状的坏点。
唯一的问题是我很难想象我会怎么做。实施这样的面具有什么好的资源或建议吗?那么,对于我想要实现的目标,是否有更好的技术?
答案 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) + ")"