Я пытаюсь найти ограничивающие рамки текста на изображении и в настоящее время использую этот подход:
// calculate the local variances of the grayscale image
Mat t_mean, t_mean_2;
Mat grayF;
outImg_gray.convertTo(grayF, CV_32F);
int winSize = 35;
blur(grayF, t_mean, cv::Size(winSize,winSize));
blur(grayF.mul(grayF), t_mean_2, cv::Size(winSize,winSize));
Mat varMat = t_mean_2 - t_mean.mul(t_mean);
varMat.convertTo(varMat, CV_8U);
// threshold the high variance regions
Mat varMatRegions = varMat > 100;
Когда дано изображение как это:
Затем, когда я показываю, varMatRegions
я получаю это изображение:
Как вы можете видеть, он несколько комбинирует левый блок текста с заголовком карты, для большинства карт этот метод отлично работает, но на более загруженных картах он может вызвать проблемы.
Причина, по которой эти контуры плохо соединяются, заключается в том, что ограничивающая рамка контура почти занимает всю карту.
Может кто-нибудь предложить другой способ найти текст, чтобы обеспечить правильное обнаружение текста?
200 очков тому, кто найдет текст на карточке над этими двумя.
Ответы:
Вы можете обнаружить текст, найдя элементы ближнего края (вдохновленные LPD):
Использование:
Полученные результаты:
а. element = getStructuringElement (cv :: MORPH_RECT, cv :: Size (17, 3));
б. element = getStructuringElement (cv :: MORPH_RECT, cv :: Size (30, 30));
Результаты аналогичны для другого упомянутого изображения.
источник
n
? Спасибо за решение, оно прекрасно работает!cv::Rect a;
. Увеличенная по п:a.x-=n/2;a.y-=n/2;a.width+=n;a.height+=n;
.Я использовал метод на основе градиента в программе ниже. Добавлены получившиеся изображения. Обратите внимание, что я использую уменьшенную версию изображения для обработки.
версия c ++
версия на питоне
источник
rect
. Там одинpyrdown
, так что умножьтеx, y, width, height
наrect
4.Вот альтернативный подход, который я использовал для обнаружения текстовых блоков:
Ниже приведен код, написанный на python с pyopencv, его легко портировать на C ++.
Исходное изображение - первое изображение в вашем посте.
После предварительной обработки (оттенки серого, порог и расширение - после шага 3) изображение выглядело так:
Ниже приведено изображение («contoured.jpg» в последней строке); последние ограничительные рамки для объектов на изображении выглядят так:
Вы можете видеть, что текстовый блок слева определяется как отдельный блок, отделенный от его окружения.
Используя тот же сценарий с теми же параметрами (за исключением типа порога, который был изменен для второго изображения, как описано ниже), вот результаты для двух других карт:
Настройка параметров
Параметры (пороговое значение, параметры расширения) были оптимизированы для этого изображения и этой задачи (поиск текстовых блоков) и могут быть скорректированы, при необходимости, для изображений других карточек или других типов объектов, которые будут найдены.
Для порога (шаг 2) я использовал черный порог. Для изображений, где текст светлее фона, например второе изображение в вашем сообщении, следует использовать белый порог, поэтому замените тип удержания на
cv2.THRESH_BINARY
). Для второго изображения я также использовал немного более высокое значение для порога (180). Изменение параметров для порогового значения и количества итераций для расширения приведет к различной степени чувствительности при разграничении объектов на изображении.Поиск других типов объектов:
Например, уменьшение расширения до 5 итераций на первом изображении дает нам более точное разграничение объектов на изображении, приблизительно находя все слова на изображении (а не текстовые блоки):
Зная приблизительный размер слова, здесь я отбрасывал области, которые были слишком маленькими (ширина или высота менее 20 пикселей) или слишком большими (ширина или высота более 100 пикселей), чтобы игнорировать объекты, которые вряд ли будут словами, чтобы получить результаты в выше изображение.
источник
cv2.findContours
. Это говоритValueError: too many values to unpack
.cv2.findContours
возвращает 3 аргумента, а оригинальный код захватывает только 2.Подход @ dhanushka показал наибольшее обещание, но я хотел поиграть в Python, поэтому продолжил и перевел это для шутки:
Теперь для отображения изображения:
Не самый Pythonic из сценариев, но я попытался максимально приблизиться к исходному коду C ++, чтобы читатели могли им следовать.
Это работает почти так же, как оригинал. Я буду рад прочитать предложения о том, как это можно улучшить / исправить, чтобы полностью соответствовать исходным результатам.
источник
drawContours
этого состояния: «Функция рисует контурные контуры на изображении, если толщина> 0, или заполняет область, ограниченную контурами, если толщина <0.» Это сделано для того, чтобы мы могли проверить соотношение ненулевых пикселей, чтобы решить, может ли поле содержать текст.Вы можете попробовать этот метод , разработанный Chucai Yi и Yingli Tian.
Они также используют программное обеспечение (которое основано на Opencv-1.0 и должно работать на платформе Windows), которое вы можете использовать (хотя исходный код недоступен). Он сгенерирует все текстовые ограничительные рамки (показанные в цветных тенях) на изображении. Применяя свои образцы изображений, вы получите следующие результаты:
Примечание: чтобы сделать результат более надежным, вы можете дополнительно объединить соседние блоки.
Обновление: если ваша конечная цель заключается в распознавании текстов на изображении, вы можете дополнительно проверить gttext , бесплатное программное обеспечение для распознавания текста и инструмент Ground Truthing для цветных изображений с текстом. Исходный код также доступен.
С этим вы можете получить признанные тексты, такие как:
источник
Над кодом JAVA версия: Спасибо @William
И используйте этот код на практике:
источник
Реализация Python для решения @ dhanushka:
источник
Это C # версия ответа от дханушки с использованием OpenCVSharp
источник
это VB.NET-версия ответа от dhanushka с использованием EmguCV .
Несколько функций и структур в EmguCV требуют иного рассмотрения, чем версия C # с OpenCVSharp
источник