如何使用Haar小波在图像上检测直线?

7

我有这样一张图片:

CG生成的浴室

我想要得到像这样的图片(我没有画出所有想要的线条,但我希望你能理解我的意思):

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

我想使用SURF((Speeded Up Robust Features)是一个强韧的图像描述符,由Herbert Bay等人在2006年首次提出),或者基于2D Haar小波响应和积分图像的求出图像上所有直线的有效方法。我想要获取相对于图片像素坐标的线段起点和终点。

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

是否有此类代码示例(具有搜索线条的功能)可供参考?

我喜欢C和C++,但任何易读的代码都可能适用于我=)


可能是https://dev59.com/UHE85IYBdhLWcg3w03Dz的重复问题。 - andand
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

alt text

alt text

alt text

如果您想要获得良好的结果,可以尝试使用相同的流程来处理其他区域,并调整参数。


1

你尝试过更简单的方法,比如使用霍夫变换来寻找直线吗?OpenCV中包含了一个名为cvHoughLines2的函数和示例,可以用来执行此操作。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接