Очистка отсканированного изображения в opencv

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

Морфед На морфизированном изображении вы можете увидеть маленький остров в правом нижнем углу.

Уменьшенное изображение сверху показывает, что линия обрывается ближе к концу.

Любой другой метод для достижения желаемого результата?

Мой код выглядит так:

int morph_elem = 2;
int morph_size = 10;
int morph_operator = 0;

Mat origImage = imread(origImgPath, CV_LOAD_IMAGE_COLOR);
medianBlur(origImage, origImage, 3);
cvtColor(origImage, origImage, COLOR_RGB2GRAY);
threshold(origImage, origImage, 0, 255, THRESH_OTSU);

Mat element = getStructuringElement(morph_elem, Size(2 * morph_size + 1, 2 * morph_size + 1), cv::Point(morph_size, morph_size));

morphologyEx(origImage, origImage, MORPH_OPEN, element);
thin(origImage, true, true, true);

2 ответа

Вы хотите выполнить серию операций закрытия и открытия изображения. Лучше всего вы понимаете, как они работают, чтобы сделать правильный выбор. См. Этот пост: удаление паразитных маленьких островков шума на изображении - Python OpenCV

Чтобы уменьшить разрыв линии, попробуйте использовать adaptiveThresholdПоиграйте с методами и размерами и посмотрите, что работает лучше всего. Чтобы удалить маленький остров просто сделайте findContours а затем замаскировать нежелательные характеристики, используя drawContours с color=(255,255,255) а также thickness=-1 после того, как вы отфильтровали его с чем-то вроде wantedContours = [x for x in contours if contourArea(x) < 50],

Другие вопросы по тегам