Home » Blog » Sketch with least-squares

Sketch with least-squares

The idea is from David Barber's page and here.

The original figure is here, as and we wish to have a sketch of it, not by hand, but from a computer program. The program is given a bunch of lines with random lengths and orientations and it seeks a weight for each of the lines through a minimisation of the least-squares error between the original and the generated figure.

The resulting figure is as follows. The MATLAB program is

```% load the image
Z = rgb2gray(yo);

N = 2000;                                  % number of lines
[Ymax, Xmax] = size(Z);                    % width and height
S = ceil(diag([Xmax Ymax])*rand(2,N));     % starting points for lines
E = ceil(diag([Xmax Ymax])*rand(2,N));     % ending points for lines
% for first run, initialise B=[];
% generating the lines (not optimised, very time consuming)
for i = 1:N
b = zeros(Ymax,Xmax);
dx = E(1,i) - S(1,i);
if dx>0
dy = E(2,i) - S(2,i);
x = linspace(S(1,i),E(1,i),abs(dx)+1);
y = round((x - S(1,i)) * dy / dx + S(2,i));
b(sub2ind(size(b), y, x)) = 1;
B = [B b(:)];
end
end
disp('Lines generated...')
%least squres
B = sparse(B);
%w = B\double(Z(:));
w = lsqr(B,double(Z(:)));
imshow(reshape(B*w,Ymax,Xmax),[0 255])```