笔画宽度变换(SWT)实现(Python)

pyl*_*ver 17 python ocr opencv computer-vision simplecv

任何人都可以描述我如何使用opencv或simplecv在python中实现SWT?

Aru*_*iRC 16

好的,所以这里:

有关实现细节的链接,底部是代码下载链接:SWT

为了完整起见,还提到SWT或笔画宽度变换是由Epshtein和其他人在2010年设计的,并且已经证明是迄今为止最成功的文本检测方法之一.它不使用机器学习或精心测试.基本上在输入图像上的Canny边缘检测之后,它会计算构成图像中对象的每个笔划的粗细.由于文本具有均匀粗的笔划,因此这可以是强大的识别特征.

在计算SWT步骤之后,链接中给出的实现使用C++,OpenCV和它们用于连接图遍历等的Boost库.就我个人而言,我已经在Ubuntu上进行了测试,它的效果非常好(并且效率很高),但准确性并不准确.


dha*_*hka 8

我实现了类似于基于距离变换的SWT中描述的SWT中描述的"具有边缘增强最大稳定极端区域自然图像中的鲁棒文本检测",陈慧忠,Sam S. 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
Run Code Online (Sandbox Code Playgroud)


Dra*_*ian 5

这里有一个完整的SWTloc库,该算法的 Python 3 实现


v2.0.0 及以上

安装库

pip install swtloc
Run Code Online (Sandbox Code Playgroud)

变换图像

pip install swtloc
Run Code Online (Sandbox Code Playgroud)

变换显示


字母本地化

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)
Run Code Online (Sandbox Code Playgroud)

字母本地化


本地化单词

localized_letters = swtImgObj.localizeLetters(minimum_pixels_per_cc=100,
                                              maximum_pixels_per_cc=10_000,
                                              acceptable_aspect_ratio=0.2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

完全披露:我是这个库的作者