大津アルゴリズムに基づくバーコード角度補正アルゴリズム

目次

1.Otsu算法概述

2. Otsuアルゴリズムによるバーコード角度補正

3.MATLABコアプログラム

4. アルゴリズムテスト結果


        大津アルゴリズムに基づくバーコード角度補正アルゴリズムは、バーコードの角度を自動的に識別して補正する手法です。この手法は、画像処理と機械学習技術を組み合わせて、画像を 2 値化およびしきい値処理することでバーコードの角度を検出し、補正します。

1.Otsu算法概述

       Otsu アルゴリズムは、グレースケール イメージをバイナリ イメージに変換するために使用される適応しきい値セグメンテーション方法です。このアルゴリズムは、2 つのクラスのピクセル (前景と背景) 間の区別を最大化するクラス間分散を計算することにより、最適なしきい値を見つけます。

       Otsu アルゴリズムに基づくバーコード角度補正アルゴリズムでは、まずグレースケールやノイズ低減操作など、画像を前処理する必要があります。次に、Otsu アルゴリズムを使用して画像を 2 値化し、バーコード領域と背景領域を分離します。

       次に、バーコードの角度を見つける必要があります。これは、画像内のすべての可能な直線方向の投影を計算することで実現できます。具体的には、画像を複数の小さな長方形領域に分割し、各長方形領域内の白いピクセルの数を数えます。次に、これらの量を、この長方形領域の対応する直線方向の投影値として取得します。

       考えられるすべての直線方向の投影値の分散を計算することで、バーコードの角度を見つけることができます。具体的には、投影値を 2 つのグループに分けることができます。1 つはバーコード領域の投影値で、もう 1 つは背景領域の投影値です。次に、これら 2 セットの投影値の分散を計算し、分散を最大化する線の方向、つまりバーコードの角度を見つけます。

      最後に、バーコードを水平方向に修正するために、見つかった角度に従って画像を回転したり平行移動したりするなどの操作を実行する必要があります。これは、画像処理ライブラリの回転および平行移動関数を使用することで実現できます。

大津アルゴリズムのクラス間分散計算式:

σ^2_B = w_0 * w_1 * (μ_0 - μ_1)^2

このうち、w_0とw_1はそれぞれ前景と背景のピクセルの重みであり、μ_0とμ_1はそれぞれ前景と背景のピクセルの平均グレー値です。

投影値の計算式は次のとおりです。

P(θ) = ∑_{x,y} I(x,y) * R(x cosθ + y sinθ, -x sinθ + y cosθ)

このうち、I(x,y)は画像の濃淡値、R(x,y)は長方形領域の指示関数、θは直線方向の角度である。

分散を計算する式は次のとおりです。

Var(P) = ∑_{i=1}^{N} (P_i - μ)^2 / N

ここで、P_i は投影値、μ は投影値の平均、N は投影値の数です。

2. Otsuアルゴリズムによるバーコード角度補正

Otsu アルゴリズムによるバーコード角度補正の実装には、主に次の手順が含まれます。

  1. 前処理: まず、グレースケールやノイズ低減操作など、入力バーコード画像を前処理します。グレースケールではカラー画像をグレースケール画像に変換でき、ノイズリダクションでは画像からノイズや干渉を除去できます。
  2. 二値化: Otsu アルゴリズムを使用して前処理された画像を二値化し、バーコード領域と背景領域を分離します。Otsu アルゴリズムは、2 種類のピクセル (前景と背景) 間の区別を最大化するクラス間分散を計算することにより、最適なしきい値を見つけます。二値化画像では、バーコード部分が白、背景部分が黒になります。
  3. 投影計算: 2 値化された画像を複数の小さな長方形領域に分割し、各長方形領域内の白ピクセルの数を計算します。これらの量は、対応する直線方向の長方形領域の投影値として取得されます。考えられるすべての直線方向の投影値を計算することにより、投影値シーケンスのセットを取得できます。
  4. 角度の決定: 投影値シーケンスの分散を計算し、分散を最大化する直線の方向、つまりバーコードの角度を見つけます。具体的には、投影値シーケンスは 2 つのグループに分けることができ、1 つのグループはバーコード領域の投影値であり、もう 1 つのグループは背景領域の投影値です。次に、これら 2 組の投影値の分散を計算し、分散を最大化する直線の方向、つまりバーコードの角度を見つけます。
  5. 画像補正:求めた角度に応じて画像の回転や平行移動などの操作を行い、バーコードを水平方向に補正します。これは、画像処理ライブラリの回転および平行移動関数を使用することで実現できます。修正された画像では、バーコード領域が水平に配置され、後続のデコード操作が容易になります。

       実際のアプリケーションでは、さまざまなバーコードの種類や画像品質に適応するためにアルゴリズムを最適化および改善する必要がある場合があることに注意してください。また、傾き角度が大きいバーコードの場合は、傾き補正を行ってから角度補正を行う必要がある場合があります。

       つまり、Otsu アルゴリズムによるバーコードの角度補正により、バーコードの認識率と精度が効果的に向上し、その後のデコード操作に信頼性の高い保証が提供されます。

3.MATLABコアプログラム

function I_seg=Otsu(I)

I= double(I);
I= medfilt2(I);         % 二维中值滤波
h_Tmean = mean(mean(I));
[height,width] = size(I);
Size = height * width;  % 图像大小
h_T = sum(sum(I));      % 图像总灰度值
G_min = min(min(I));    % 最小灰度值
G_max = max(max(I));    % 最大灰度值
I_seg = zeros(height,width);     % the array to store the segmented image
thresh = 0;          % the threshold(边界)
num1 = 0;
num2 = 0;            % count the num of the pixel(像素) from the diffrient class
P1 = 0;
P2 = 0;              % the probability (概率)of the different class
h_T1 = 0;
h_T2 = 0;            % the total gray value of different class 
h_T1mean = 0;
h_T2mean = 0;        % the mean value of the class
Max = 0;
for thresh=G_min:G_max     % find the best threshold
    h_T1 = 0;
    h_T2 = 0;
    num1 = 0;
    for h=1:height
        for w=1:width
             if I(h,w) <= thresh
                  num1 = num1 + 1;
                  h_T1 = h_T1 + I(h,w);
             end
         end
     end
     num2 = Size - num1;
     h_T2 = h_T - h_T1;
     P1 = num1/Size;
     P2 = num2/Size;
     h_T1mean = h_T1/num1;
     h_T2mean = h_T2/num2;
     D1 = P1*P2*(h_T1mean - h_T2mean)^2;%类间方差            
     if D1 > Max
         Max = D1;
         T_best = thresh;   % T record the best thresh
     end
 end
 
 %%%%%%% Seg the image %%%%%%%%%
 for i=1:height
     for j=1:width
         if I(i,j) > T_best
             I_seg(i,j) =255;
         end
     end
 end
up2208

4. アルゴリズムテスト結果

->

おすすめ

転載: blog.csdn.net/ccsss22/article/details/133445754