Spaces:
Sleeping
Sleeping
%%% 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 | |