图片大小的相似度 比如原图是正方形,目标有很多图。找出最像正方形的图。 代码: ``` 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'} ``` 相符 来自 大脸猫 写于 2017-05-08 17:31 -- 更新于2020-10-19 13:06 -- 0 条评论