Может ли кто-нибудь описать, как я могу реализовать SWT в python, используя opencv или simplecv?
Выполнение преобразования ширины штриха (SWT) (Python)
Ответ 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