给定一组点,如何确定哪个是左上角、右上角、右下角和左下角(TL,TR,BR,BL)
这些是位于下面的图像上的黑色方块的和弦。(每页各向下4页)
下面是共弦(x,y) (原点0,0是左上角):
[(147.68485399616046, 3304.5385975548143),
(168.3419544680192, 2336.686128749161),
(188.1491476566771, 1331.864619054719),
(211.6472437750393, 155.6040367158578),
(2216.6064720878203, 3330.396441392227),
(2233.7510405426237, 2363.6828015004367),
(2250.9856437171966, 1360.935679736544),
(2273.392518618822, 187.8742947415933)]通过沿着x轴对这些数据进行排序,我可以取前4和底部4,这为页面的每一侧都提供了一列。
然后,我对和弦对进行了求和,即147+3304 = 3451等等。通过对这个求和值上的和弦进行排序,我可以将最小值作为TL的同弦,对于BR取最高的和弦(因为这将是最大的x+y组合)。
http://i.stack.imgur.com/GxXJd.jpg这是好的,除了当我遇到这组和弦:
[(203.68919057903938, 154.66471253728272),
(2264.8873935264055, 180.78268029528675),
(987.6169366297244, 1156.4133276499006),
(184.2811080835604, 1331.004238570996),
(167.45816773667582, 2336.89386528075),
(2236.836364657011, 2356.0815089255643),
(150.94371083838226, 3304.3057324840765),
(2223.8576991353148, 3323.427188913703)]如果按上面的方式处理,我的TR定位值为987,1156,而不是2264,180。
http://i.stack.imgur.com/aVp4f.jpg那么,我如何编程确定我的四个角和弦?
注意,我已经编辑了这些图像,但它们仍然给出了相同的输出。
http://i.stack.imgur.com/cyMG5.jpg
http://i.stack.imgur.com/aVp4f.jpg
http://i.stack.imgur.com/h8ylN.jpg
http://i.stack.imgur.com/rF7Sw.jpg
http://i.stack.imgur.com/GxXJd.jpg
http://i.stack.imgur.com/837nR.jpg发布于 2013-12-03 14:39:13
这是一种效率低下的方法,但我认为是直接的方法。
TL、TR、BL、BR的基本特征是它们最接近每个角。如果你取任何一组xy点,那么你所需要做的就是找到每个拐角的最短距离。
下面的代码正是用蛮力完成的(将所有点与所有角进行比较)。可以复制粘贴到解释器上。因为我不知道你给出的图像的极端性,所以我不得不根据可用的点来获取它们。您可以通过提供图像本身的角来跳过这一点。
ok = [(147.68485399616046, 3304.5385975548143),
(168.3419544680192, 2336.686128749161),
(188.1491476566771, 1331.864619054719),
(211.6472437750393, 155.6040367158578),
(2216.6064720878203, 3330.396441392227),
(2233.7510405426237, 2363.6828015004367),
(2250.9856437171966, 1360.935679736544),
(2273.392518618822, 187.8742947415933)]
bad = [(203.68919057903938, 154.66471253728272),
(2264.8873935264055, 180.78268029528675),
(987.6169366297244, 1156.4133276499006),
(184.2811080835604, 1331.004238570996),
(167.45816773667582, 2336.89386528075),
(2236.836364657011, 2356.0815089255643),
(150.94371083838226, 3304.3057324840765),
(2223.8576991353148, 3323.427188913703)]
def distance(xy1, xy2):
(x1, y1), (x2, y2) = xy1, xy2
return ((float(y2-y1))**2 + (float(x2-x1))**2)**0.5
def fake_image_corners(xy_sequence):
"""Get an approximation of image corners based on available data."""
all_x, all_y = zip(*xy_sequence)
min_x, max_x, min_y, max_y = min(all_x), max(all_x), min(all_y), max(all_y)
d = dict()
d['tl'] = min_x, min_y
d['tr'] = max_x, min_y
d['bl'] = min_x, max_y
d['br'] = max_x, max_y
return d
def corners(xy_sequence, image_corners):
"""Return a dict with the best point for each corner."""
d = dict()
d['tl'] = min(xy_sequence, key=lambda xy: distance(xy, image_corners['tl']))
d['tr'] = min(xy_sequence, key=lambda xy: distance(xy, image_corners['tr']))
d['bl'] = min(xy_sequence, key=lambda xy: distance(xy, image_corners['bl']))
d['br'] = min(xy_sequence, key=lambda xy: distance(xy, image_corners['br']))
return d
def main():
for xy_sequence in (ok, bad):
image_corners = fake_image_corners(xy_sequence)
d = corners(xy_sequence, image_corners)
print '********'
for k, v in d.items():
print k, v
main()输出:
********
bl (147.68485399616046, 3304.5385975548143)
tl (211.6472437750393, 155.6040367158578)
tr (2273.392518618822, 187.8742947415933)
br (2216.6064720878203, 3330.396441392227)
********
bl (150.94371083838226, 3304.3057324840765)
tl (203.68919057903938, 154.66471253728272)
tr (2264.8873935264055, 180.78268029528675)
br (2223.8576991353148, 3323.427188913703)https://stackoverflow.com/questions/20332562
复制相似问题