src_root = 'H:\matlab\Az_Docter_Project\MB';
dst_root = 'H:\matlab\Az_Docter_Project\MB_edge';
lst_set = 'H:\matlab\Az_Docter_Project\MB';
lst_set = [lst_set '.lst']; % lst_set -> 'H:\matlab\Az_Docter_Project\MB.lst'
index_file = fullfile(lst_set); % index_file -> H:\matlab\Az_Docter_Project\MB.lst.lst
%open
fileID = fopen(index_file); % disp(fileID) -> 3 表示有三个参数吗
im_ids = textscan(fileID, '%s');
% disp(im_ids) -> {31x1 cell} 31表示.lst文件有多少行
im_ids = im_ids{1};
% disp(im_ids)
%im_ids:
% 'COCO_train2014_000000004823'
% ...
% 'COCO_train2014_000000014502'
fclose(fileID);
% close
num_images = length(im_ids); % 31
for im_id = 1:num_images
id = im_ids{im_id}; % 从1到31, 1为例 'COCO_train2014_000000004823'
id = id(1:end-0); % 原版是end-4,这是因为要减去'.png', 因为我们的MB.lst已经去掉后缀了这里不需要
% img_path = fullfile(data_root, [id '.jpg']);
% image = imread(img_path);
gt = imread(fullfile(src_root, [id '.png']));
% fullfile加,会自动补充分割符号 -> 'H:\matlab\Az_Docter_Project\MB' + 'COCO_train2014_000000004823.png'
% 'H:\matlab\Az_Docter_Project\MB\COCO_train2014_000000004823.png'
%计算edge
gt = (gt > 128); % 只选取亮度到达一定程度的,在这里都一样
gt = double(gt);
[gy, gx] = gradient(gt); % 计算xy方向的梯度
temp_edge = gy.*gy + gx.*gx; % x^2 + y^2
temp_edge(temp_edge~=0)=1; % 只要不等于零,置1
bound = uint8(temp_edge*255); % x255
save_path = fullfile(dst_root, [id '_edge.png']);
% out_root -> 'H:\matlab\Az_Docter_Project\MB';
% id -> 'COCO_train2014_000000004823'
% '_edge.png'
imwrite(bound, save_path);
end
index_file = fullfile( [lst_set '.lst'] );
% '/home/liuj/dataset/DUTS/DUTS-TR/train.lst'
使用方法1
f = fullfile(‘dir1’, ‘dir2’, …, ‘filename’)
fullfile构成地址字符串;
注意:自动添加斜线
如:输入:f = fullfile(‘C:’, ’ Applications’, ’matlab’, ’fun.m’)
得到:f =‘C:\Applications\matlab\fun.m’
使用方法2
index_file = fullfile([lst_set '.lst']);
不加逗号,直接连接
% '/home/liuj/dataset/DUTS/DUTS-TR/train.lst'
fileID = fopen(index_file);
fopen()是个将数据按指定格式读入到matlab中的函数。
matlab中fopen函数的常用调用格式
1)fid = fopen(‘filename’)
2)fid= fopen(‘filename’,’permission’)
其中fid是文件代号,filename是要打开的文件名,permission是打开方式,默认的打开方式是只读模式。第一种情况时选择默认的打开方式,第二种是认为指定打开方式。
fid是文件的句柄(或者理解为文件的代号),使用fopen()后默认会返回一个文件代号给fid变量,常用的返回值如下:
fid=+N(N是正整数):表示文件打开成功,文件代号是N.
fid=-1 : 表示文件打开不成功。fileID在此次文件关闭前总是有效的。
如果以读方式打开,matlab首先搜索工作目录,其次搜索matlab的其他目录,“permission”是打开方式参数。
打开方式参数由以下字符串确定:
r 读出
w 写入(文件若不存在,自动创建)
a 后续写入(文件若不存在,自动创建)
r+ 读出和写入(文件应已存在)
w+ 重新刷新写入,(文件若不存在,自动创建)
a+ 后续写入(文件若不存在,自动创建))
w 重新写入,但不自动刷新
a 后续写入,但不自动刷新
fprintf()是个将数据按指定格式写入到文本文件中的函数。
fprintf函数可以将数据按指定格式写入到指定的文本文件中。
基本格式fprintf(fid, format, A)
fid为文件句柄,从fopen()函数中得到,若缺省,则输出到屏幕; format用来指定数据输出时采用的格式:
%d 整数
%e 实数:科学计算法形式
%f 实数:小数形式
%g 由系统自动选取上述两种格式之一
%s 输出字符串
A是用来存放数据的矩阵。
im_ids = textscan(fileID, '%s');
textscan更适合读入大文件;
textscan可以从文件的任何位置开始读入,而textread 只能从文件开头开始读入;
textscan也可以从上一次textscan结束的位置开始读入,而textread不能;
textscan只返回一个数组(其实应该说是一个细胞矩阵),而textread要返回多个数组(嗯嗯);
textscan提供更多转换读入数据的选择;
textscan提供给用户更多的配置参数。