2016-08-22 4 views
0

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

Morphed На синтезированные изображения, вы можете увидеть небольшой остров в нижнем правом углу.

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

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

Мой код выглядит следующим образом:

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

На двоичном изображении (после порога) вы можете 'findContour' и удалить маленькие, например. используя 'contourArea' – Miki

ответ

1

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