7

所以我有这样的图像:

CG生成的浴室

我想得到这样的东西(我没有画出我想要的所有线条,但我希望你能明白我的想法):

黑白 CG 生成的浴室,瓷砖之间有一些红线

我想使用 SURF((Speeded Up Robust Features)是一种强大的图像描述符,由Herbert Bay 等人于 2006 年首次提出)或基于 2D Haar 小波响应之和并有效利用积分图像的东西找到图像上的所有直线。我想获得相对于图片像素坐标线的起点和终点。

所以在这张图片上找到瓷砖之间的所有线条和顶部的那两条黑线。

是否有任何这样的代码示例(具有行搜索功能)可以开始?

我喜欢 C 和 C++,但任何其他可读的代码都可能对我有用=)

4

3 回答 3

4

下面是一个完整的应用霍夫变换来检测线条的例子。我正在使用 MATLAB 来完成这项工作..

诀窍是将图像划分为多个区域并进行不同的处理;这是因为您的场景中有不同的“纹理”(墙壁上部区域的瓷砖与底部较暗的瓷砖完全不同,并且一次处理图像并不是最佳的)。

作为一个工作示例,请考虑以下示例:

%# load image, blur it, then find edges
I0  = rgb2gray( imread('http://www.de-viz.ru/catalog/new2/Holm/hvannaya.jpg') );
I = imcrop(I0, [577 156 220 292]);     %# select a region of interest
I = imfilter(I, fspecial('gaussian', [7 7], 1), 'symmetric');
BW = edge(I, 'canny');

%# Hough Transform and show accumulated matrix
[H T R] = hough(BW, 'RhoResolution',2, 'Theta',-90:0.5:89.5);
imshow(imadjust(mat2gray(H)), [], 'XData',T, 'YData',R, ...
       'InitialMagnification','fit')
xlabel('\theta (degrees)'), ylabel('\rho')
axis on, axis normal, colormap(hot), colorbar, hold on

%# detect peaks
P  = houghpeaks(H, 20, 'threshold',ceil(0.5*max(H(:))));
plot(T(P(:,2)), R(P(:,1)), 'gs', 'LineWidth',2);

%# detect lines and overlay on top of image
lines = houghlines(BW, T, R, P, 'FillGap',50, 'MinLength',5);
figure, imshow(I), hold on
for k = 1:length(lines)
    xy = [lines(k).point1; lines(k).point2];
    plot(xy(:,1), xy(:,2), 'g.-', 'LineWidth',2);
end
hold off

替代文字

替代文字

替代文字

您可以在其他地区尝试相同的过程,同时调整参数以获得良好的结果。

于 2010-04-08T13:41:38.063 回答
1

您是否尝试过更简单的方法,例如用于查找线的 Hough 变换?OpenCV 中包含一个执行此操作的函数和示例,称为cvHoughLines2

于 2010-04-08T11:24:21.833 回答
0

二维小波变换在 R 中使用Waveslim包实现。具体来说,函数 dwt2D() 使用 C“后端”来提高速度。然后,您可以应用阈值来查找线条。

于 2010-04-11T11:23:53.853 回答