问题描述
我正在尝试根据对象在2张或更多图片中的位置来标记对象。 基本算法理论上应该很简单:
下面的图像有助于可视化该问题,其中左侧的图像将是img_b的分割图,右侧的图像将是img_a的分割目标(来自img_b的红色标记仅供参考,不应该属于结果)。
这些图像与我使用的图像不完全相同,但是非常相似。对象具有不规则的形状(例如,中间图像上的红色对象/组),尺寸变化很大,并且沿图像不规则地分布。当我应用如下所示的解决方案时,即使img_b是img_a与另一个图像的并集,我仍会在目标seg_map中注意到许多丢失的对象,好像没有找到重叠。
直到现在,我一直在尝试通过使用bBox和图像的分割图生成数据框(通过cv.connectedComponentWithStats())。然后,我尝试通过测试是否有任何边界框重叠来匹配对象,如果是,我将新标签设置为df中的列。下一步是仅基于“新”标签值映射seg_map中的值。
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 (将#修改为@)