%description: % dilate edge datas (gradient norm, x gradient, y gradient) % using a distance function from a binary edge image. The resulting % datas contain for each pixel the values of the closest edge pixel. %param: % img_source = binary canny edges % img_value_norm = gradient norm of the edges % img_value_x = x gradient of the edges % img_value_y = y gradient of the edges % radius = size of the dilation %result: % val_norm = dilated gradient norm % val_x = dilated x gradient % val_y = dilated y gradient function [val_norm, val_x, val_y] = distance_dilate(img_source, img_value_norm, img_value_x, img_value_y, radius) %distance map dist = img_source.*0 + (1-img_source).*1000; %distance mask mask(1,:) = [4, 3, 4]; mask(2,:) = [3, 0, 3]; mask(3,:) = [4, 3, 4]; %image size [h,w,c] = size(img_value_x); %edge values val_norm(:,:,1) = img_value_norm(:,:,1).*img_source; val_x(:,:,1) = img_value_x(:,:,1).*img_source; if c>1 val_x(:,:,2) = img_value_x(:,:,2).*img_source; val_x(:,:,3) = img_value_x(:,:,3).*img_source; end val_y(:,:,1) = img_value_y(:,:,1).*img_source; if c>1 val_y(:,:,2) = img_value_y(:,:,2).*img_source; val_y(:,:,3) = img_value_y(:,:,3).*img_source; end %loop over the image to compute chanfrein distance %first pass dist_temp = dist; val_temp_norm = val_norm; val_temp_x = val_x; val_temp_y = val_y; for i=2:h-1 for j=2:w-1 dmin = dist(i,j,:); valmin = val_norm(i,j,:); valxmin = val_x(i,j,:); valymin = val_y(i,j,:); for n=-1:1 dcurr = dist_temp(i-1,j+n,:)+mask(1,2+n); if dcurr