使用OpenCV进行条纹布检测

3

我正在尝试检测布料图片中的水平和垂直条纹图案。应该检测到的两个图片示例如下:

enter image description here enter image description here

我的第一种方法是尝试使用霍夫线检测器。问题在于衣服经常变形或起皱,因此线条不是直线,检测器失败了。

可以假设线条是水平或垂直的,并且有几度的偏差(水平和垂直条纹图案)。还可以假设这些线条是平行的。

如何检测这些略微变形的线条?


2
你试过使用LSD(线段检测器)而不是霍夫线吗? - GilLevi
谢谢。我要试试这个。 - GuillermoMP
OpenCV没有haar finder功能吗?你可以训练它来识别条纹衣服。 - xmoex
@GilLevi 谢谢!我最终使用了LSD,它比hough检测线条效果好得多。请注意,LSD未包含在OpenCV 2.x中,但您可以在此处找到具有头文件的相同实现:https://github.com/23pointsNorth/lsd_opencv - GuillermoMP
我认为它包含在OpenCV3中:http://docs.opencv.org/trunk/modules/imgproc/doc/feature_detection.html - GilLevi
1个回答

10
  • 将图像转换为灰度
  • 计算梯度(例如使用sobel)
  • 对梯度图像进行水平和垂直投影
  • 阈值化投影并计算峰值

我快速尝试了一下Matlab。您可以尝试使用opencv。使用reduce函数进行投影。以下是Matlab代码和一些结果:

im = imread('pRfUL.jpg');
gr = rgb2gray(im);
h = fspecial('sobel');
grad = imfilter(gr, h) + imfilter(gr, h'); % quick gradient

hpr = sum(grad);
vpr = sum(grad');

figure,
subplot(2,2,1), imshow(gr), title('gray scale')
subplot(2,2,2), imshow(grad), title('gradient')
subplot(2,2,3), plot(hpr), title('horizontal projection')
subplot(2,2,4), plot(vpr), title('vertical projection')

在此输入图片描述

编辑

一个可能的改进是分别考虑水平和垂直情况。因此,针对每种情况对图像进行两次遍历(这可能对于噪声/纹理情况执行得更好,并且正如Nallath指出的-我认为他指的是双边滤波-你可以使用一些附加滤波)。也就是说,在寻找水平条带时,请使用水平滤波器,它将为水平方向的边缘提供强烈的响应。垂直情况也是如此。

grad = imfilter(gr, h); % for strong horizontal responses in the above code. use grad = imfilter(gr, h') for vertical

水平情况下的结果:请注意,水平投影和垂直偏移显著降低了。

enter image description here


哇,谢谢你提供如此详细的答案。听起来是一个简单而伟大的想法。我唯一能看到的问题是重质地纹理/噪点图像,但是对图像/渐变/投影进行一些处理应该可以解决这些情况。我也要尝试一下这个方法。 - GuillermoMP
2
你可以通过应用中值/高斯(或任何其他类型的)模糊来消除噪声。OpenCV甚至在图像处理部分隐藏了一个更好的噪声去除算法。它非常慢,但效果很好。 - Nallath
谢谢Dhanushka,根据给定的情况和条件分别处理水平和垂直情况确实是一个很好的改进。 - GuillermoMP
我接受了这个答案,因为它在纯水平和垂直场景中运作得非常好。如果你处理的是随机方向,那么我必须说 LSD(线段检测器)给了我非常好的结果。 - GuillermoMP

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