迭代项目列表并将它们分组到具有相似性的字典中的最快方法是什么

2024-06-26 01:34:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张图片列表。最快的方法是将列表中的图像与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

Tags: in列表forpngcv2img1img2imread
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)

没有任何额外的细节

创建一个函数,使用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}

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

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()}

相关问题 更多 >