比如原图是正方形,目标有很多图。找出最像正方形的图。 代码:
def get_similar_size(sources, dsts):
"""
输入sources,返回dsts中对应size接近的列表。其中 len(dsts) >= len(sources)
数据类型:
source: ["270*180", "25*45", "45*45", "45*45"]
dst要保证有id,size属性。
用例:
source:["270*180", "25*45", "45*45", "45*45"]
dst:{id:0, size:"270*270" }
{id:1, size:"45*27" }
{id:2, size:"96*75" }
{id:3, size:"45*96" }
{id:4, size:"15*32" }
{id:5, size:"340*320" }
返回:
{'id': 1, 'size': '45*27'}
{'id': 3, 'size': '45*96'}
{'id': 0, 'size': '270*270'}
{'id': 5, 'size': '340*320'}
时间复杂度:n*n
"""
class Pic(object):
def __init__(self,width,height):
self.height = height
self.width = width
inner_sources = [Pic(int(x.split("*")[0]), int(x.split("*")[1])) for x in sources]
inner_dsts_list = []
for dst in dsts:
temp_dst = Pic(int(dst.size.split("*")[0]), int(dst.size.split("*")[1]))
temp_dst.id = dst.id
inner_dsts_list.append(temp_dst)
result_id = []
for temp_inner_source in inner_sources:
target = pic_size_most_similar(temp_inner_source, inner_dsts_list)
result_id.append(target.id)
inner_dsts_list.remove(target)
result = []
for id in result_id:
result.append(_find_by_id(id, dsts))
return result
def _find_by_id(id, target_list):
for item in target_list:
if id==item.id:
return item
def pic_size_most_similar(source, dsts):
"""
原理:无论目标图多大,把它等比缩放(扩大)到与原图等宽
然后算出此时的高,求与原图高的差距,即可算出相似性
返回大小最相似的图片
时间复杂度: n
"""
target = None
mini_distance = 65535
for dst in dsts:
target_height = dst.height * source.width / float(dst.width)
distance = abs(target_height - source.height)
if distance < mini_distance:
target = dst
mini_distance = distance
return target
用例:
class DbPics(object):
def __init__(self):
self.id = 0
self.size = ""
sources = ["270*180", "25*45", "45*45", "45*45"] # width * height
test_data_dsts = ["270*270", "45*27", "96*75", "45*96", "15*32","340*320"]
dsts = []
for k,v in enumerate(test_data_dsts):
temp_dst = DbPics()
temp_dst.id = k
temp_dst.size = v
dsts.append(temp_dst)
result = get_similar_size(sources, dsts)
for item in result:
print item.__dict__
输出:
{'id': 1, 'size': '45*27'}
{'id': 3, 'size': '45*96'}
{'id': 0, 'size': '270*270'}
{'id': 5, 'size': '340*320'}
相符