2016-08-22 1 views
0

J'essaie de dénouer l'image puis d'extraire le squelette d'une image contenant une ligne manuscrite. Je veux que la ligne soit continue et solide mais la méthode que j'utilise ne le fait pas et relativement lentement. Voici l'image originale: Original ImageNettoyage d'une image numérisée dans opencv

Morphed Sur l'image morph, vous pouvez voir une petite île en bas à droite.

L'image amincie ci-dessus montre que la ligne est cassée vers la fin.

Toute autre méthode pour atteindre le résultat souhaité?

Mon code ressemble à ceci:

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

Sur l'image binaire (après le seuil), vous pouvez 'trouver des contours et en retirer de petits, par ex. en utilisant 'contourArea' – Miki

Répondre

1

Pour réduire la ligne briser essayer de distance à l'aide adaptiveThreshold, jouer avec les méthodes et les tailles et de voir ce qui fonctionne le mieux. Pour supprimer l'îlot, faites simplement findContours puis masquer les spécifications indésirables en utilisant drawContours avec color=(255,255,255) et thickness=-1 après l'avoir filtré avec quelque chose comme wantedContours = [x for x in contours if contourArea(x) < 50].