Выполнение преобразования ширины штриха (SWT) (Python) - программирование
Подтвердить что ты не робот

Выполнение преобразования ширины штриха (SWT) (Python)

Может ли кто-нибудь описать, как я могу реализовать SWT в python, используя opencv или simplecv?

4b9b3361

Ответ 1

Итак, вот так:

Ссылка, которая содержит информацию о реализации с ссылкой для загрузки кода внизу: SWT

Для полноты, также отметив, что SWT или Shrow Shidth Transform было разработано Epshtein и другими в 2010 году и оказалось одним из наиболее успешных методов обнаружения текста до даты. Он не использует машинное обучение или сложные тесты. В основном после обнаружения края Canny на входном изображении он вычисляет толщину каждого штриха, который составляет объекты на изображении. Поскольку текст имеет равномерно толстые штрихи, это может быть надежной идентифицирующей функцией.

Реализация, данная в ссылке, использует С++, OpenCV и Boost библиотеку, которую они используют для связанных графиков и т.д. после вычисления шага SWT. Лично я тестировал его на Ubuntu, и он работает достаточно хорошо (и эффективно), хотя точность не является точной.

Ответ 2

Я реализовал нечто похожее на SWT, основанное на преобразовании расстояния, описанное в ' ОБНАРУЖЕНИЕ ОБОРОТНОГО ТЕКСТА В ПРИРОДНЫХ ИЗОБРАЖЕНИЯХ С КРАЙНЫМИ МАКСИМАЛЬНО СТАБИЛЬНЫМИ ЭКСТРЕМАЛЬНЫМИ РЕГИОНАМИ Хуйчжун Чен, Сэм С. Цай, Георг Шрот, Дэвид М. Чен, Радек Гжещук, Бернд Гирод.

Это не то же самое, что описано в статье, но приблизительное приближение, которое служило моей цели. Думаю, я должен поделиться им, чтобы кто-нибудь мог найти его полезным (и указать на ошибки/улучшения). Он реализован на С++ и использует 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