6

所以我有一个这样的形象:如何使用Haar小波检测图像上的线条?

 CG generated bathroom

我想是这样的(我还没有得出我希望所有的行,但我希望你能得到我的想法):

 Black & White CG generated bathroom with some red lines between tiles

我想用(SURF(加速稳健特征)是一个强大的图像描述符,首先由赫伯特湾等在2006年提出的)或东西是基于二维Haar小波响应,使资金效率使用积分图像查找图像上的所有直线。我想获得相对于图片像素坐标线的起点和终点。

因此,在此图片上查找瓷砖和上面的2条黑线之间的所有线条。

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

我爱C和C++,但其他任何可读的代码可能会为我工作=)

+0

http://stackoverflow.com/questions/2596722/is-there-any-super-fast-algorithm-for-finding-lines-on-picture的可能的复制 – andand 2010-04-08 21:03:08

回答

3

以下是应用霍夫变换检测线的完整示例。我正在使用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 

alt text

alt text

alt text

你可以尝试其他地区相同的过程,而调整参数,以获得好结果..

+0

Hough变换是相当慢...我必须使用2K现场视频... – Rella 2010-04-08 15:11:40

1

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

+0

它看起来篦!) – Rella 2010-04-08 11:26:57

0

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