web-dev-qa-db-ja.com

ストローク幅変換(SWT)の実装(Python)

Opencvまたはsimplecvを使用してpythonでSWTを実装する方法を誰かが説明できますか?

17
pylover

さて、ここに行きます:

実装の詳細が記載されているリンクで、下部にコードダウンロードリンクがあります: [〜#〜] swt [〜#〜]

完全を期すために、SWTまたはStroke Width Transformが2010年にEpshteinなどによって考案され、これまでで最も成功したテキスト検出方法の1つであることが判明したことにも言及します。機械学習や手の込んだテストは使用しません。基本的に、入力画像でキャニーエッジを検出した後、画像内のオブジェクトを構成する各ストロークの太さを計算します。テキストのストロークは均一に太いため、これは堅牢な識別機能になります。

リンクに示されている実装では、C++、OpenCV、およびSWTステップの計算後に接続されたグラフ走査などに使用される Boost ライブラリを使用しています。個人的にはUbuntuでテストしましたが、精度は正確ではありませんが、非常にうまく(そして効率的に)動作します。

16
AruniRC

'エッジが強化された最大安定の極値領域を持つ自然画像でのロバストテキスト検出 byHuizhong Chen、SamSで説明されている距離変換ベースのSWTに似たものを実装しました。 Tsai、Georg Schroth、David M. Chen、Radek Grzeszczuk、Bernd Girod '。

それは論文で説明されているものと同じではありませんが、私の目的を果たした大まかな概算です。誰かがそれを役に立つと思うかもしれないので(そしてエラー/改善を指摘するために)私はそれを共有するべきだと思った。これはC++で実装され、OpenCVを使用します。

    // bw8u : we want to calculate the SWT of this. NOTE: Its background pixels are 0 and forground pixels are 1 (not 255!)
    Mat bw32f, swt32f, kernel;
    double min, max;
    int strokeRadius;

    bw8u.convertTo(bw32f, CV_32F);  // format conversion for multiplication
    distanceTransform(bw8u, swt32f, CV_DIST_L2, 5); // distance transform
    minMaxLoc(swt32f, NULL, &max);  // find max
    strokeRadius = (int)ceil(max);  // half the max stroke width
    kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); // 3x3 kernel used to select 8-connected neighbors

    for (int j = 0; j < strokeRadius; j++)
    {
        dilate(swt32f, swt32f, kernel); // assign the max in 3x3 neighborhood to each center pixel
        swt32f = swt32f.mul(bw32f); // apply mask to restore original shape and to avoid unnecessary max propogation
    }
    // swt32f : resulting SWT image
8
dhanushka