【问题标题】:Barcode detection using Hough Transform & Edge Detection使用 Hough 变换和边缘检测进行条码检测
【发布时间】:2013-07-22 09:16:17
【问题描述】:

需要使用霍夫变换和边缘检测技术进行条码检测的 Matlab 代码。

我为此尝试了内置 matlab 函数,但无法得到结果,因为我对霍夫变换、边缘检测或条形码检测知之甚少

因此,非常感谢任何形式的帮助。到目前为止,我做到了..

a=imread('BEAN13.jpg');

b = rgb2gray(a);
rotI = imrotate(b,30,'crop');
%figure,imshow(rotI)

BW = edge(rotI,'sobel');
[H,T,R] = hough(BW);
imshow(H,[],'XData',T,'YData',R,...
    'InitialMagnification','fit');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
P  = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
x = T(P(:,2)); y = R(P(:,1));
plot(x,y,'s','color','white');

lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
figure, imshow(rotI), 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 

现在我需要一种用于条形码扫描/解码的算法......并且还需要建议以更好地进行霍夫变换。

【问题讨论】:

    标签: matlab image-processing barcode hough-transform


    【解决方案1】:

    那么,必须使用霍夫变换吗?条形码分析通常比这容易得多,因为您先验地知道所有条形码行都是平行的。如果您能保证它们会被相对准确地扫描(即:条码扫描器大致垂直于条码线操作,上下左右 30 度),您可以只取条码图像的单个“切片”,所以它从MxN 图像变为1xN 图像。

    然后,您只需使用阈值或分割(即:K-means 分割)将图像转换为纯黑白。然后,您可以执行噪声去除(中值或模式滤波器是理想的),这样单个噪声像素就不会将单个条形码行分成两个单独的行。

    最后可以用一个for循环来计算每列的宽度:

    pixel_color = img[0][0];
    int i;
    int width = image_width(img); // 'N'
    unsigned bars[width] = { 0 };
    int currentBar = 0;
    
    for (i=0; i<width; i++) {
       bars[currentBar] += 1;
       if (img[0][i] != pixel_color) { // Detected a new bar
         currentBar++;
         pixel_color = img[0][i];
       }
    }
    

    一般来说,边缘检测对条形码没有用处,因为无论如何它们已经是平行边缘,并且边缘检测算法引入了一些基本过滤和可能的阈值处理的需求,以将灰度图像降低为黑白图像。对此类问题使用简单的 LaPlace/边缘检测过滤器只会增加工作量,而不会使问题更容易解决。

    此外,霍夫变换(即:微不足道的非参数形式)对于检测形状很有用(一个常见的本科问题是计算图片中铅笔的数量,其中有重叠,或正交铅笔)。更复杂/参数形式的变换对于检测图片中的任意对象很有用。


    1. 阈值http://en.wikipedia.org/wiki/Thresholding_%28image_processing%29
    2. K-means 分割http://en.wikipedia.org/wiki/K_means
    3. LaPlace 过滤器http://www.owlnet.rice.edu/~elec539/Projects97/morphjrks/laplacian.html
    4. 模式过滤器http://www.roborealm.com/help/Mode.php

    【讨论】:

    • 感谢您的帮助。但我的项目需要使用霍夫变换和亚像素边缘检测。然后我需要一个条形码解码算法。
    • 嗯,上面的循环给你一个简单的条形码解码算法。您可能只需要缩放 bars[] 向量中的总和。
    • 有一个解决方案。它基本上涉及首先对图像进行阈值处理,然后使用霍夫变换通过搜索霍夫变换中的最大峰值来检测条形码二维图像中的最长单条线。然后,您可以使用主成分分析来确定线条的方向角,然后通过旋转对图像进行归一化。然后你可以使用我上面的简单线宽检测循环代码。霍夫变换的唯一需要是图像没有预先对齐。
    • 这应该有助于霍夫变换部分。 mathworks.com/help/vision/ref/vision.houghtransformclass.html你真的应该买一本关于图像处理的书,读一读霍夫变换背后的数学。
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 2019-03-19
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2019-11-22
    • 2012-10-17
    相关资源
    最近更新 更多