78 lines
2.0 KiB
Matlab
78 lines
2.0 KiB
Matlab
%%% Prerequisites
|
|
% You need to get the cpp file edgesNmsMex.cpp from https://raw.githubusercontent.com/pdollar/edges/master/private/edgesNmsMex.cpp
|
|
% and compile it in Matlab: mex edgesNmsMex.cpp
|
|
% You also need to download and install Piotr's Computer Vision Matlab Toolbox: https://pdollar.github.io/toolbox/
|
|
|
|
%%% parameters
|
|
% hed_mat_dir: the hed mat file directory (the output of 'batch_hed.py')
|
|
% edge_dir: the output HED edges directory
|
|
% image_width: resize the edge map to [image_width, image_width]
|
|
% threshold: threshold for image binarization (default 25.0/255.0)
|
|
% small_edge: remove small edges (default 5)
|
|
|
|
function [] = PostprocessHED(hed_mat_dir, edge_dir, image_width, threshold, small_edge)
|
|
|
|
if ~exist(edge_dir, 'dir')
|
|
mkdir(edge_dir);
|
|
end
|
|
fileList = dir(fullfile(hed_mat_dir, '*.mat'));
|
|
nFiles = numel(fileList);
|
|
fprintf('find %d mat files\n', nFiles);
|
|
|
|
for n = 1 : nFiles
|
|
if mod(n, 1000) == 0
|
|
fprintf('process %d/%d images\n', n, nFiles);
|
|
end
|
|
fileName = fileList(n).name;
|
|
filePath = fullfile(hed_mat_dir, fileName);
|
|
jpgName = strrep(fileName, '.mat', '.jpg');
|
|
edge_path = fullfile(edge_dir, jpgName);
|
|
|
|
if ~exist(edge_path, 'file')
|
|
E = GetEdge(filePath);
|
|
E = imresize(E,[image_width,image_width]);
|
|
E_simple = SimpleEdge(E, threshold, small_edge);
|
|
E_simple = uint8(E_simple*255);
|
|
imwrite(E_simple, edge_path, 'Quality',100);
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
function [E] = GetEdge(filePath)
|
|
load(filePath);
|
|
E = 1-edge_predict;
|
|
end
|
|
|
|
function [E4] = SimpleEdge(E, threshold, small_edge)
|
|
if nargin <= 1
|
|
threshold = 25.0/255.0;
|
|
end
|
|
|
|
if nargin <= 2
|
|
small_edge = 5;
|
|
end
|
|
|
|
if ndims(E) == 3
|
|
E = E(:,:,1);
|
|
end
|
|
|
|
E1 = 1 - E;
|
|
E2 = EdgeNMS(E1);
|
|
E3 = double(E2>=max(eps,threshold));
|
|
E3 = bwmorph(E3,'thin',inf);
|
|
E4 = bwareaopen(E3, small_edge);
|
|
E4=1-E4;
|
|
end
|
|
|
|
function [E_nms] = EdgeNMS( E )
|
|
E=single(E);
|
|
[Ox,Oy] = gradient2(convTri(E,4));
|
|
[Oxx,~] = gradient2(Ox);
|
|
[Oxy,Oyy] = gradient2(Oy);
|
|
O = mod(atan(Oyy.*sign(-Oxy)./(Oxx+1e-5)),pi);
|
|
E_nms = edgesNmsMex(E,O,1,5,1.01,1);
|
|
end
|