我正在研究具有重叠线形的图像(左图)。最终我想分割单个对象。我正在使用Hough变换来实现这一点,并且它可以很好地找到(显着)不同方向的线 - 例如由下面的hough空间中的两个最大值表示(中间图)。
由于我不知道,一个连接区域可能包含多少个线对象,我的想法是迭代地提取对应于具有最高激活的hough线对象(此处涂成蓝色),即移除线形对象从图像中,以便下一次迭代只能找到另一行。
但是如何检测哪些像素属于线形对象?
函数hough_bin_pixels(img, theta, rho, P)
(来自here - 显示在右图中)给出了与特定行对应的像素。但这显然是太过于无法表示对象的线条。
有没有办法分割/检测沿最强的houghline定向的整个物体?
答案 0 :(得分:1)
关键是要知道原始图像中的粗线转换为霍夫变换上的较宽峰。此图显示了细线和粗线的峰值。
您可以使用任何您喜欢的策略将每个峰的所有像素/累加器箱组合在一起。我建议使用multithresh和imquantize将其转换为BW图像,然后bwlabel标记已连接的组件。您还可以使用任意数量的其他群集/分段策略。唯一可能棘手的部分是找出适当的阈值水平。如果你不能得到适合你的应用程序的任何东西,那么错误就包含太多,因为你以后总能摆脱错误的像素。
以下是阈值处理(左)和标记(右)
后的霍夫变换的峰值获得峰区域后,您可以使用hough_bin_pixels
找出原始图像中的哪些像素对每个累加器箱的贡献。然后,对于每个峰区域,将hough_bin_pixels
的结果组合为该区域的每个区域。
这是我拼凑在一起创建示例图像的代码。我暂时没有使用它后回到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