如何将图像数据转换为.mat文件,mat文件内是cell封装的struct格式的数据

发布时间:2024年01月03日

在我看论文:《?Holistically-nested Edge Detection (HED) 》的时候,对论文中有关边缘结果的评价指标很感兴趣,于是我就研究了如何计算这些指标

如果有同样感兴趣或者有需要的小伙伴可以下载这里的代码:GitHub - xwjabc/hed: A PyTorch reimplementation of Holistically-Nested Edge Detection?进行学习,相信会给你带来收获的!

其中,我在运行文件 eval_edge.m 的时候总是会报错,如图所示:

看错误的位置是在文件 edgesEvalImg.m 第55行处:引用了不存在的字段 ' groundTruth '?,打开该文件,可以看到有这样一句代码:

通过我对该文件源码的理解,此处的G是真实边缘标签图像数据所在的路径,所以我应该将我的tif格式的图像数据转换为字段为groundTruth的MAT文件

这是我的40张真实边缘标签图像

在这里,我使用如下图所示的代码对40张真实边缘标签图像数据进行转换

转换结果如下图所示:

可以看到每张tif图像数据都对应着其mat文件,说明转换成功了!

But

当我再次运行eval_edge.m文件的时候,又出现了新的错误,如图所示:

这个错误依然发生在文件 edgesEvalImg.m 中,在该文件的第77行处:此类型的变量不支持使用花括号进行索引

这说明数据依然不符合这里要求的格式

经过上网查找资料,我意识到这里需要的是由cell数组封装的struct的mat文件

所以不但需要将边缘标签图像数据转换为.mat文件,而且还应该是由cell数组封装的结构体mat文件

故,使用如下图所示代码可以将40张真实边缘标签图转换为符合要求的数据格式

# 每张tif格式的图像数据转换为mat文件,该mat文件是由cell数组封装的struct类型的
import scipy.io as sio
data_dir = 'images/test_mat/'
for filename in os.listdir(data_dir):
    name_extracted = filename.rsplit('.', maxsplit=1)[0]  # 使用 rsplit() 函数以 '_' 分割文件名,仅获取前两个部分
    print(f"基本名称为:{name_extracted}")
    print(f"图像路径为:{os.path.join(data_dir,filename)}")
    # img = cv2.imread(os.path.join(data_dir,filename))
    img = cv2.imread(os.path.join(data_dir,filename),0)
    label_name = f"images/test_mat/{name_extracted}.mat"  
    sio.savemat(label_name, {'groundTruth':[{'Boundaries':img}]})

运行结果如下图所示:

可以得到新的转换后的mat文件,将它们用matlab打开,可以看到如图所示的数据存储结构:

首先是一个cell数组,其次cell数组是一个1x1的struct(结构体),结构体中是大小为512x512的图像矩阵

此时再次运行文件 eval_edge.m,可以看到成功了!

文章来源:https://blog.csdn.net/Kelly_Ai_Bai/article/details/135372453
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。