opencvまたはsimplecvを使用してPythonでSWTを実装する方法を誰かが説明できますか?
3 に答える
さて、ここに行きます:
実装の詳細が記載されているリンクと、下部にあるコードダウンロードリンク:SWT
完全を期すために、SWTまたはStroke Width Transformが2010年にEpshteinなどによって考案され、これまでで最も成功したテキスト検出方法の1つであることが判明したことにも言及します。機械学習や手の込んだテストは使用しません。基本的に、入力画像のキャニーエッジ検出後、画像内のオブジェクトを構成する各ストロークの太さを計算します。テキストのストロークは均一に太いため、これは堅牢な識別機能になります。
リンクに示されている実装では、SWTステップが計算された後、C ++、OpenCV、およびそれらが接続されたグラフ走査などに使用するBoostライブラリを使用しています。個人的にはUbuntuでテストしましたが、精度は正確ではありませんが、非常にうまく(そして効率的に)動作します。
ユークリッド距離変換ベースのSWTに似たものを実装しました。これは、Huizhong Chen、Sam S. Tsai、Georg Schroth、David M. Chen、Radek Grzeszczuk、 BerndGirodによる「エッジが強化された最大安定外部領域を使用した自然画像の堅牢なテキスト検出」で説明されています。 。
それは論文で説明されているものと同じではありませんが、私の目的を果たした大まかな概算です。誰かがそれを役に立つと思うかもしれないように(そしてエラー/改善を指摘するために)私はそれを共有するべきだと思った。これは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
完全なライブラリSWTlocがここにありますアルゴリズムのPython3実装
v2.0.0以降
ライブラリをインストールします
pip install swtloc
画像の変換
import swtloc as swt
imgpath = 'images/path_to_image.jpeg'
swtl = swt.SWTLocalizer(image_paths=imgpath)
swtImgObj = swtl.swtimages[0]
swt_mat = swtImgObj.transformImage(text_mode='lb_df',
auto_canny_sigma=1.0,
maximum_stroke_width=20)
手紙のローカライズ
localized_letters = swtImgObj.localizeLetters(minimum_pixels_per_cc=100,
maximum_pixels_per_cc=10_000,
acceptable_aspect_ratio=0.2)
単語のローカライズ
localized_words = swtImgObj.localizeWords()
完全開示:私はこのライブラリの作成者です