【问题标题】:Extract line shaped objects提取线形物体
【发布时间】:2017-01-17 15:18:43
【问题描述】:

我正在处理具有重叠线条形状的图像(左图)。最终我想分割单个对象。我正在使用霍夫变换来实现这一点,它在寻找(显着)不同方向的线方面效果很好 - 例如由下面霍夫空间中的两个最大值表示(中间图)。

  • 绿线和黄线(左图)和十字线(右图)源于一种对线条粗细进行处理的方法。但是我不知道如何提取粗线,所以我没有跟进。
  • 我知道分配“重叠像素”的歧义。我稍后会解决这个问题。

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

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

函数hough_bin_pixels(img, theta, rho, P)(来自here - 显示在右图)给出了对应于特定线的像素。但这显然太细了,无法代表物体。

有没有办法分割/检测沿最强轮廓线定向的整个对象?

【问题讨论】:

    标签: matlab object-detection hough-transform


    【解决方案1】:

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

    您可以使用任何您喜欢的策略将每个峰值的所有像素/累加器箱分组在一起。我建议使用 multithreshimquantize 将其转换为 BW 图像,然后使用 bwlabel 标记连接的组件。您还可以使用任意数量的其他聚类/分割策略。唯一可能棘手的部分是确定适当的阈值水平。如果您无法获得适合您的应用程序的任何内容,请不要包含太多内容,因为您以后总是可以摆脱错误的像素。

    这是阈值(左)和标记(右)后霍夫变换的峰值

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

    这是我为创建示例图像而编写的代码。暂时不使用matlab,刚回到matlab,请原谅马虎的代码。

    % 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
    

    【讨论】:

    • 这实际上是一个非常酷的想法。它有它的问题,如果线条的长度确实不同,阈值方法可以掩盖不如全局最大值“高”的局部霍夫最大值(对应于较小的线条)。我仍在努力,但除此之外,这是一个不错的方法!谢谢!
    • 对于将来引用此答案的任何人,解决阈值问题的一个好方法是使用均值偏移在霍夫变换中找到局部最大值。
    • 嗨@Honeybear,如果这个答案解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
    • 谢谢@Matthew Pope,我没有接受,因为我希望有其他想法。但到目前为止,我将其用作妥协。会尝试你的平均转移建议,也谢谢你。
    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 2011-03-09
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多