关键是要知道原始图像中的粗线会转化为霍夫变换上更宽的峰值。此图显示了细线和粗线的峰。
您可以使用任何您喜欢的策略将每个峰值的所有像素/累加器箱分组在一起。我建议使用 multithresh 和 imquantize 将其转换为 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