我已经检测到线轮廓,并且想拟合一个线方程来描述它。
我尝试了最小二乘拟合,但是由于透视变形,线的一端较粗,因此线方程的一端向一侧偏移。
我也考虑过使用zhang-suen细化方法,但是对于简单的代码来说,这样的算法似乎过分杀了
最佳答案
一种简单有效的方法是计算直线上点的第一个 principal component 。这是matlab中的代码:
% Read image
im = imread('https://i.stack.imgur.com/pJ5Si.png');
% Binarize image and extract indices of line pixels
imbw = imbinarize(rgb2gray(im), 'global'); % Threshold with Otsu's method
[y, x] = ind2sub(size(imbw), find(imbw)); % Get indices of line pixels
% Extract first principal component
C = cov(x, y); % Compute covariance of x and y
coeff = pcacov(C); % Compute eigenvectors of C
vector_xy = [coeff(1,1), coeff(2,1)]; % Get fist principal component
% Plot
figure; imshow(im); hold on
xx = vector_xy(1) * [-1 1] * size(imbw,2) + mean(x(:));
yy = vector_xy(2) * [-1 1] * size(imbw,2) + mean(y(:));
plot(xx,yy,'c','LineWidth',2)
axis on, legend('Principal Axis','Location','NorthWest')
您可以使用以下方法获得线方程
y = a*x + b
的系数a = vector_xy(2) / vector_xy(1);
b = mean(y(:)) - a * mean(x(:));
关于python - 如何提取适合粗线轮廓中间的线方程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42870583/