在matlab中使用hough变换/ houghlines检测特定行

时间:2013-03-20 12:50:02

标签: matlab hough-transform

我目前正在做一个matlab项目,我必须从图像中隔离条形码并读取条形码信息。 我正在使用的方法是Hough变换,一旦变换完成,我使用houghpeakshoughlines,这样我就可以确定条形码上每条线之间的距离。我的图像可能是水平或垂直的。

我遇到的问题是houghpeak检测和houghline绘图。当我有一个有垂直线条的图像时,它没有检测到条形码的每一行。我在条形码图像下方有一个链接,我正在绘制线条,我希望我指定长度的每条垂直线(在此图像的情况下为65)都有一条线叠加在它上面,这样我就可以接受信息并测量每条线之间的距离

enter image description here

我选择65作为我的'MinLength'的原因是因为如果我没有指定这个高值,我会在图像的其他部分绘制水平线。

我尝试实现sobel边缘检测,以便指定水平/垂直方向,但使用它时会出错:('参考不存在的字段'point1')。

我对'FillGap'参数也不太清楚,我已经阅读了matlab的帮助,但我仍然没有理解它。我玩过不同的价值观试图去了解它,但我不太清楚。

我还尝试使用不仅仅是条形码的图像来实现代码。

enter image description here

在这张图片中,它也只是拾起似乎是随机的高峰,因此没有绘制我想要的hough线。

所以我的问题是,任何人都可以告诉我为什么代码没有在图像中的条形码的每个'线'上绘制所有的hough线。

以下是代码。

提前致谢!

 I  = imread('barcode (2).jpg');
 I = im2double(I);
 I = rgb2gray(I);
 BW = edge(I,'canny');
 [H,T,R] = hough(BW);
 figure(1),imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');
 xlabel('\theta'), ylabel('\rho');
 axis on, axis normal, hold on;
 P  = houghpeaks(H,26,'threshold',ceil(0.5*max(H(:))));
 x = T(P(:,2)); 
 y = R(P(:,1));
 plot(x,y,'s','color','white');


 % Find lines and plot them
 lines = houghlines(BW,T,R,P,'FillGap',2,'MinLength',65);
 figure, imshow(BW), hold on
 max_len = 0;
 for k = 1:length(lines)
   xy = [lines(k).point1; lines(k).point2];
   plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');

   % plot beginnings and ends of lines
   plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
   plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');

   % determine the endpoints of the longest line segment 
   len = norm(lines(k).point1 - lines(k).point2);
   if ( len > max_len)
     max_len = len;
     xy_long = xy;
   end
 end

 % highlight the longest line segment
 plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');

1 个答案:

答案 0 :(得分:1)

为什么不在条形码的整个长度上绘制轮廓,而不是进行线检测来计算条形码。通过这种方式,您可以检测峰和谷,以区分黑色和白色部分。

您需要更少的计算能力,而且您的代码会更容易。