Очистка отсканированного изображения в 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]
,