Извлечение обнаруженных областей MSER (Python, OpenCV)


person lucians    schedule 01.12.2017    source источник
comment
Как вы хотите их «спасти»? Одно изображение на область, независимо от размера? Извлечение подмассивов этих регионов? Не могли бы вы уточнить, каков ожидаемый результат?   -  person GPhilo    schedule 01.12.2017
comment
@GPhilo отредактировал вопрос   -  person lucians    schedule 01.12.2017
comment
Посмотрите здесь: bytefish.de/blog/extracting_contours_with_opencv   -  person lorenzo    schedule 06.12.2017
comment
Читал это прямо сейчас ... как вы думаете, это будет работать с изображениями, которые содержат такие маленькие числа?   -  person lucians    schedule 06.12.2017
comment
Фильтр Канни (или размытие + порог) может сделать их достаточно большими для этого. В противном случае используйте findContours или MSER, чтобы найти большие белые пятна, как вы сделали выше, и используйте их в качестве маски. Но, как сказал GPhilo, вы можете сохранять только прямоугольные изображения, использование закругленного контура может быть полезно только для исключения некоторого шума.   -  person lorenzo    schedule 06.12.2017
comment
Итак, официально я не могу сохранять фигуры MSER с содержимым внутри..   -  person lucians    schedule 06.12.2017
comment
@lorenzo нашел это https://stackoverflow.com/questions/15341538/numpy-opencv-2-how-do-i-crop-non-rectangular-region   -  person lucians    schedule 29.12.2017


Ответы (3)


Просто получите ограничивающую рамку для каждого контура, используйте ее в качестве области интереса, чтобы выделить область и сохранить ее:

for i, contour in enumerate(hulls):
    x,y,w,h = cv2.boundingRect(contour)
    cv2.imwrite('{}.png'.format(i), img[y:y+h,x:x+w])
person GPhilo    schedule 01.12.2017
comment
Вы пробовали? Я спрашиваю, потому что это не работает. Я имею в виду, он что-то сохраняет (мусор для большинства файлов), но это не нормально. Вместо этого мне нравится способ подсчета файлов со строками форматирования. - person lucians; 01.12.2017
comment
Не могу попробовать, потому что у меня нет образцов данных для запуска, возможно, я поменял местами координаты x и y в img[...]. Не могли бы вы попробовать запустить его с помощью img[y:y+h, x:x+w] и посмотреть, исправит ли это проблему? - person GPhilo; 01.12.2017
comment
Да, координаты поменялись местами. Теперь это работает. Просто чтобы знать, приведенный выше код является стандартным для сохранения ограничивающих рамок (я имею в виду x, y, w, h...)? - person lucians; 01.12.2017
comment
Спасибо, исправил ответ с правильным порядком координат. В python OpenCV boundingRect возвращает 4-кортеж (x,y,w,h), который я извлек непосредственно из 4 значений, потому что они нужны мне для индексации массива. В идеале, если вам нужно сохранить ограничивающую рамку, вы должны оставить 4-кортеж как есть. - person GPhilo; 01.12.2017
comment
Можете ли вы показать мне также, как заказать их? Спасаются дико. - person lucians; 01.12.2017
comment
Они сохраняются в том порядке, в котором они находятся в hulls, поэтому, если вы хотите, чтобы они каким-то образом были отсортированы, вам нужно отсортировать этот список. - person GPhilo; 01.12.2017
comment
РЕДАКТИРОВАТЬ: сделал это... было просто. - person lucians; 01.12.2017
comment
извините, если я вас беспокою, но мне интересно одно: код, который вы предложили, создает ограничивающую рамку вокруг обнаруженных областей, а затем сохраняется, блок за блоком. Но что, если я хочу сохранить форму, обнаруженную MSER? Не создавать рамку вокруг каждого символа, а извлекать его точную форму. Вы знаете, как это сделать? Спасибо - person lucians; 04.12.2017
comment
Вы можете сохранять только прямоугольные изображения, поэтому я получаю ограничивающую рамку. Если вам нужна форма, вы можете сохранить данные из умножения входного изображения и маски (т. Е. Третьего изображения в вашем вопросе), таким образом, у вас будет черный контур, который вы можете удалить впоследствии в ваша обработка - person GPhilo; 04.12.2017
comment
Но какую переменную здесь сохранить как маску? Я попытался записать только текст, но это спасло мне все изображение, а не одну ROI. - person lucians; 04.12.2017

detectRegions также возвращает ограничивающие рамки:

regions, boundingBoxes = mser.detectRegions(gray)

for box in boundingBoxes:
        x, y, w, h = box;
        cv2.rectangle(vis, (x, y), (x+w, y+h), (0, 255, 0), 1)

Это рисует зеленые прямоугольники или сохраняет их, как указано в ответе GPhilo.

person Manstie    schedule 23.08.2019

Привет, нашел более чистый способ получить ограничительные рамки

regions, _ = mser.detectRegions(roi_gray)

bounding_boxes = [cv2.boundingRect(p.reshape(-1, 1, 2)) for p in regions]
person Alex Moruz    schedule 17.05.2020
comment
Как уже упоминалось Mansite, detectRegions фактически возвращает эти ограничивающие рамки во втором возвращаемом аргументе (который вы обозначаете как _) - person feature_engineer; 21.12.2020