使用OpenCV进行条纹布检测

时间:2014-07-02 10:19:15

标签: c++ opencv

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

enter image description here enter image description here

我的第一种方法是尝试使用Hough Line探测器。问题是衣服经常变形或起皱,因此线条不直,检测器失效。

可以假设线条是水平的或垂直的,具有几度的偏差(水平和垂直条纹图案)。线条也是平行的

检测这种轻微变形线条的好方法是什么?

1 个答案:

答案 0 :(得分: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')

enter image description here

修改

一种可能的改进是分别考虑水平和垂直情况。因此,对于每种情况,图像会有两次通过(这对于嘈杂/纹理的情况可能表现得更好,而且正如Nallath指出的那样 - 我认为他指的是双边滤波 - 你可以使用一些额外的过滤) 。也就是说,当您查找水平条带时,请使用水平过滤器,这将为水平方向边缘提供强烈响应。垂直情况也是如此。

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

水平情况的结果:请注意水平投影和垂直偏移已显着下降

enter image description here