【问题标题】:What is the fastest way to iterate over a list of items and group them to a dictionary with a similarity score迭代项目列表并将它们分组到具有相似度分数的字典的最快方法是什么
【发布时间】:2019-05-06 14:08:05
【问题描述】:

我有一个图像列表。将列表中的图像与similarity(imga,imgb) 分数进行比较并将它们组合到一个字典中的最快方法是什么,在返回的相似性阈值之后将第一项作为键。

示例

ImgList = [img1, img2, img3,img4, img5,img6]

如果img1,img3的相似度得分为0.7(>0.5)

如果img2,im4,img6相似度为0.6(>0.5)

Output = {img1:[img3], img2:[img4,img6], img5:[]}

我的方法(索引错误)

for i in ImgList:
     for j in ImgList:
          #compare code here
          ImgList.remove(j)

编辑

def get_sim(img1,img2):
    (score, diff) = measure.compare_ssim(img1, img2, full=True)
    return score

img1 = cv2.imread("1.png")
img2 = cv2.imread("2.png") 
img3 = cv2.imread("3.png")
img4 = cv2.imread("4.png") 
img5 = cv2.imread("5.png")
img6 = cv2.imread("6.png") 

imgs = [img1,img2,img3,img4,img5,img6]

for i in imgs:
    for j in imgs:
        similarity = get_sim(i,j) # values in range 0 to 1
            if(similarity>=0.5):
                imgs.remove(j)
                #Need to group i,j

【问题讨论】:

  • 到目前为止,您在相似度得分方面做了哪些尝试,您能否举例说明您使用什么数据结构来保存相似度得分?
  • @DeveshKumarSingh 它是一个函数,它接收两张图像并根据它们的直方图相似度返回一个分数。
  • 是的,您能否向我们展示一个该函数为您的图像列表输出的示例示例?
  • @DeveshKumarSingh 添加了附加代码
  • 不是代码,是示例输出,当您运行代码时!我无法运行代码并猜测相似性,你能运行你拥有的代码,制作一个 6x6 2D 矩阵并将其添加到问题中吗?

标签: python list comparison


【解决方案1】:

没有任何额外的细节,

创建一个函数,该函数使用similarity 函数创建一个高于阈值的列表,然后在字典理解中使用该函数。像这样:

def find_imgs_above_threshold(img, img_list, threshold=0.5):
    img_list_without_img = img_list.remove(img)
    sim_scores = [similarity(img, i) for i in img_list_without_img]
    imgs_above_threshold= [score for score in sim_scores if score >= threshold]
    return imgs_above_threshold

img_dict = {i: find_imgs_above_threshold(i, imgList) for i in imgList}

【讨论】:

    【解决方案2】:

    我以前的回答可能不符合您的要求,这可能有效:

    res = {}
    for i in range(len(ImgList)):
        for j in ImgList[i:]:
            res.setdefault(get_sim(ImgList[i],j), []).append(j)
    res = {i.pop(0):i for i in res.values()}
    

    你可以用列表理解的方式来写它

    res = {}
    _ = [res.setdefault(get_sim(ImgList[i],j), []).append(j) for i in range(len(ImgList)) for j in ImgList[i:]]
    res = {i.pop(0):i for i in res.values()}
    

    【讨论】:

      【解决方案3】:
      imgs = [cv2.imread(f"{i}.png") for i in range(1, 7)]
      
      output = {}
      score_img = {}
      
      for img in imgs:
          score = get_sim(img)
          if score > 0.5:
              if score not in score_img:
                  score_img[score] = img
                  output[img] = []
              else:
                  output[score_img[score]].append(img)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-28
        • 2018-01-25
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 2021-04-20
        • 1970-01-01
        • 2013-10-01
        相关资源
        最近更新 更多