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

时间:2012-06-20 09:06:58

标签: python opencv computer-vision ocr simplecv

有谁能描述我如何使用opencv或simplecv在python中实现SWT?

3 个答案:

答案 0 :(得分:16)

好的,所以这里:

包含底部代码下载链接的实施细节的链接:SWT

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

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

答案 1 :(得分:8)

我实现了类似于基于距离变换的SWT中描述的东西 ' 自然图像中的强大文本检测,具有边缘增强的最大稳定极端区域 Huizhong Chen,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

答案 2 :(得分:2)

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

安装库

pip install swtloc

应用SWT转换和分组

from swtloc import SWTLocalizer
from swtloc.utils import imgshowN, imgshow

swtl = SWTLocalizer()
imgpaths = ... # Image paths, can be one image or more than one
swtl.swttransform(imgpaths=imgpath, save_results=True, save_rootpath='swtres/',
                  edge_func = 'ac', ac_sigma = 1.0, text_mode = 'wb_bf',
                  gs_blurr=True, blurr_kernel = (5,5), minrsw = 3, 
                  maxCC_comppx = 10000, maxrsw = 200, max_angledev = np.pi/6, 
                  acceptCC_aspectratio = 5)

imgshowN([swtl.orig_img,swtl.swt_mat], [“原始图像”,“笔画宽度变换”])

enter image description here

获取气泡边界框

respacket = swtl.get_grouped(lookup_radii_multiplier=1, sw_ratio=2,
                             cl_deviat=[13,13,13], ht_ratio=2, 
                             ar_ratio=3, ang_deviat=30)

grouped_labels = respacket[0]
grouped_bubblebbox = respacket[1]
grouped_annot_bubble = respacket[2]
grouped_annot = respacket[3]
maskviz = respacket[4]
maskcomb  = respacket[5]

imgshowN([swtl.orig_img, swtl.swt_labelled3C, grouped_annot_bubble],
         ['Original', 'SWT','Bubble BBox Grouping'])

enter image description here

其他一些结果

enter image description here enter image description here

完全公开:我是这个图书馆的作者