提取线形对象

时间:2017-01-17 15:18:43

标签: matlab object-detection hough-transform

我正在研究具有重叠线形的图像(左图)。最终我想分割单个对象。我正在使用Hough变换来实现这一点,并且它可以很好地找到(显着)不同方向的线 - 例如由下面的hough空间中的两个最大值表示(中间图)。

houghline - full example

  • 绿线和黄线(左图)和十字(右图)源于对线条粗细做某事的方法。我无法弄清楚如何提取一条宽线,所以我没有跟进。
  • 我知道分配“重叠像素”的模糊性。我稍后会解决这个问题。

由于我不知道,一个连接区域可能包含多少个线对象,我的想法是迭代地提取对应于具有最高激活的hough线对象(此处涂成蓝色),即移除线形对象从图像中,以便下一次迭代只能找到另一行。

但是如何检测哪些像素属于线形对象?

函数hough_bin_pixels(img, theta, rho, P)(来自here - 显示在右图中)给出了与特定行对应的像素。但这显然是太过于无法表示对象的线条。

有没有办法分割/检测沿最强的houghline定向的整个物体?

1 个答案:

答案 0 :(得分:1)

关键是要知道原始图像中的粗线转换为霍夫变换上的较宽峰。此图显示了细线和粗线的峰值。

Thick and thin line with resulting Hough Transform

您可以使用任何您喜欢的策略将每个峰的所有像素/累加器箱组合在一起。我建议使用multithreshimquantize将其转换为BW图像,然后bwlabel标记已连接的组件。您还可以使用任意数量的其他群集/分段策略。唯一可能棘手的部分是找出适当的阈值水平。如果你不能得到适合你的应用程序的任何东西,那么错误就包含太多,因为你以后总能摆脱错误的像素。

以下是阈值处理(左)和标记(右)

后的霍夫变换的峰值

Thresholded peaks Labeled peaks

获得峰区域后,您可以使用hough_bin_pixels找出原始图像中的哪些像素对每个累加器箱的贡献。然后,对于每个峰区域,将hough_bin_pixels的结果组合为该区域的每个区域。

Reconstructed Lines

这是我拼凑在一起创建示例图像的代码。我暂时没有使用它后回到matlab,所以请原谅这些邋code的代码。

% Create an image
image = zeros(100,100);

for i = 10:90
    image(100-i,i)=1;
end;

image(10:90, 30:35) = 1;

figure, imshow(image); % Fig. 1 -- Original Image

% Hough Transform
[H, theta_vals, rho_vals] = hough(image);
figure, imshow(mat2gray(H)); % Fig. 2 -- Hough Transform

% Thresholding
thresh = multithresh(H,4);
q_image = imquantize(H, thresh);
q_image(q_image < 4) = 0;
q_image(q_image > 0) = 1;
figure, imshow(q_image) % Fig. 3 -- Thresholded Peaks

% Label connected components
L = bwlabel(q_image);
figure, imshow(label2rgb(L, prism)) % Fig. 4 -- Labeled peaks

% Reconstruct the lines
[r, c] = find(L(:,:)==1);
segmented_im = hough_bin_pixels(image, theta_vals, rho_vals, [r(1) c(1)]);
for i = 1:size(r(:))
    seg_part = hough_bin_pixels(image, theta_vals, rho_vals, [r(i) c(i)]);
    segmented_im(seg_part==1) = 1;
end
region1 = segmented_im;

[r, c] = find(L(:,:)==2);
segmented_im = hough_bin_pixels(image, theta_vals, rho_vals, [r(1) c(1)]);
for i = 1:size(r(:))
    seg_part = hough_bin_pixels(image, theta_vals, rho_vals, [r(i) c(i)]);
    segmented_im(seg_part==1) = 1;
end
region2 = segmented_im;

figure, imshow([region1 ones(100, 1) region2]) % Fig. 5 -- Segmented lines

% Overlay and display
out = cat(3, image, region1, region2);
figure, imshow(out); % Fig. 6 -- For fun, both regions overlaid on original image