Я собирался предложить очистить ваши строки, как сказал Ян, но если вы не хотите этого делать, вы также можете заняться каким-нибудь вариантом грубого преобразования.
http://en.wikipedia.org/wiki/Hough_transform
Из этого вы сможете получить фактическое уравнение для линии, чтобы вы могли сделать ее такой же тонкой или толстой, как вам нравится. Единственная сложная часть - выяснить, где заканчивается линия.
Вот код, который я написал для грубого преобразования несколько лет назад, написанный на MATLAB. Я не уверен, насколько хорошо это работает, но это должно дать вам общее представление. Он найдет все линии (не сегменты) на изображении
im = imread('cube.tif');
[bin1,bin2,bin3] = canny(im);
%% define constants
binary = bin1;
distStep = 10; % in pixels
angStep = 6; % in degrees
thresh = 50;
%% vote
maxDist = sqrt((size(binary,1))^2+(size(binary,2))^2);
angLoop = 0:angStep*pi/180:pi;
origin = size(binary)/2;
accum = zeros(ceil(maxDist/distStep)+1,ceil(360/angStep)+1);
for y=1:size(binary,2)
for x=1:size(binary,1)
if binary(x,y)
for t = angLoop
dx = x-origin(1);
dy = y-origin(2);
r = x*cos(t)+y*sin(t);
if r < 0
r = -r;
t = t + pi;
end
ri = round(r/distStep)+1;
ti = round(t*180/pi/angStep)+1;
accum(ri,ti) = accum(ri,ti)+1;
end
end
end
end
imagesc(accum);
%% find local maxima in accumulator
accumThresh = accum - thresh;
accumThresh(logical(accumThresh<0)) = 0;
accumMax = imregionalmax(accumThresh);
imagesc(accumMax);
%% calculate radius & angle of lines
dist = [];
ang = [];
for t=1:size(accumMax,2)
for r=1:size(accumMax,1)
if accumMax(r,t)
ang = [ang;(t-1)*angStep/180*pi];
dist = [dist;(r-1)*distStep];
end
end
end
scatter(ang,dist);