前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图片大小的相似度

图片大小的相似度

作者头像
超级大猪
发布2019-11-22 14:49:01
1.6K0
发布2019-11-22 14:49:01
举报
文章被收录于专栏:大猪的笔记大猪的笔记

比如原图是正方形,目标有很多图。找出最像正方形的图。 代码:

代码语言:javascript
复制
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

用例:

代码语言:javascript
复制
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__

输出:

代码语言:javascript
复制
{'id': 1, 'size': '45*27'}
{'id': 3, 'size': '45*96'}
{'id': 0, 'size': '270*270'}
{'id': 5, 'size': '340*320'}

相符

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-05-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档