根据位置从两张图像中标记对象

问题描述

我正在尝试根据对象在2张或更多图片中的位置来标记对象。 基本算法理论上应该很简单:

  • 从img_a中选择项目
  • 检查它是否与img_b中的任何对象重叠
    • 检查它是否仅与img_b中的一个对象重叠
    • 否则:检查最大的重叠并相应地分配标签

下面的图像有助于可视化该问题,其中左侧的图像将是img_b的分割图,右侧的图像将是img_a的分割目标(来自img_b的红色标记仅供参考,不应该属于结果)。

Labelling goal example

这些图像与我使用的图像不完全相同,但是非常相似。对象具有不规则的形状(例如,中间图像上的红色对象/组),尺寸变化很大,并且沿图像不规则地分布。当我应用如下所示的解决方案时,即使img_b是img_a与另一个图像的并集,我仍会在目标seg_map中注意到许多丢失的对象,好像没有找到重叠。

直到现在,我一直在尝试通过使用bBox和图像的分割图生成数据框(通过cv.connectedComponentWithStats())。然后,我尝试通过测试是否有任何边界框重叠来匹配对象,如果是,我将新标签设置为df中的列。下一步是仅基于“新”标签值映射seg_map中的值。

进行测试:img_a img_b

def create_table_from_bin(bin_img):
    connectivity = 8

    nb_components,seg_map,stats,centroids =  cv.connectedComponentsWithStats(bin_img,connectivity,cv.CV_32S)

    spots_df = pd.DataFrame(stats)
    spots_df.columns = ['x','y','w','h','Area']
    spots_df['centroids_x'] = centroids[:,0]
    spots_df['centroids_y'] = centroids[:,1]
    
    for i in range(nb_components):
        if spots_df['Area'].loc[i] < 50:
            seg_map[seg_map==i] = 0
            spots_df = spots_df.drop(i)

    spots_df = spots_df.drop(0)

    return spots_df,seg_map
def overlap(bBox1,bBox2):
    #for x axis 
    if (bBox1.x < bBox2.x < (bBox1.x + bBox1.w)) or (bBox1.x < (bBox2.x + bBox2.w)< (bBox1.x + bBox1.w)):
        if (bBox1.y < bBox2.y < (bBox1.y + bBox1.h)) or (bBox1.y < (bBox2.y + bBox2.h)< (bBox1.y + bBox1.h)):
            return True
    return False

def match_tables(df_a,df_b):
 
    
    match_table = df_b.copy()
    
    df0 = df_a.copy()
    df1 = df_b.copy()
    
    match_table['label'] = None
    
    
    for i in tqdm(df1.index):
        for o in df0.index:
            if match_table['label'].loc[o]==None:
                if overlap(df1.loc[i],df0.loc[o]):
                    match_table['label'].loc[o] = i



    return match_table

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)