1

需要使用 Hough 变换和边缘检测技术进行条码检测的 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 

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

4

1 回答 1

3

那么,必须使用霍夫变换吗?条形码分析通常比这容易得多,因为您先验地知道所有条形码行都是平行的。如果您能保证它们会被相对准确地扫描(即:条码扫描器大致垂直于条码线操作,上下左右 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
于 2013-07-22T17:05:42.463 回答