2015-11-06 1 views
2

J'essaie de détecter le bord de la ligne horizontale noire au premier plan maculé de gris. Le bord/résultat souhaité est légèrement marqué en rouge.Comment trouver le bord de la ligne sombre à la zone grisée

Desired Result


Qu'ai-je essayé jusqu'à présent:

Mon approche était d'utiliser la Segmentation norme Chan-Vese combiné avec plusieurs méthodes preprocseeing comme estompement gaussienne, filtre maximum ou opérateur morpholigocal comme l'érosion. Cependant, lorsque j'initialise la fonction de jeu de niveaux dans la partie inférieure de l'image, le contour est bloqué juste avant le bord de départ.

Chan-Vese result

En raison du bruit que je ne peux pas me débarrasser sans détruire des informations importantes de l'image, des méthodes simples comme le filtrage Sobel ou Prewitt risque d'échouer. Une autre idée de moi était de rechercher l'intensité maximale/minimale par colonne de l'image et de marquer le pixel le plus sombre par colonne. Comme vous pouvez le supposer, cela échouera aussi parce que le bord que je cherche n'est pas la seule partie qui a des pixels sombres, c'est pourquoi cette méthode est très sujette aux erreurs.

Modifier

Les serpents ne vous aide pas non plus.

Active Contour with Snakes

Le contour actif, marqué comme bleu, va tout simplement sur le bord et à gauche et à droite le contour est bloqué. Le code que j'ai essayé était la fonction Snake2D (I, P, Options) prise de here.


Voici l'image originale si vous souhaitez m'aider.

Original Image

+0

Salut! De nombreux programmes OCR utilisent [filtrage Gabor] (https://en.wikipedia.org/wiki/Gabor_filter) pour la détection des contours. Peut-être que vous devriez chercher cette approche. – jkalden

+0

Avez-vous essayé des contours actifs (aka serpents)? –

+0

Je n'ai pas encore essayé les serpents. Les informations de gradient qui y sont incluses pourraient être utiles pour le bord désiré. Je vais éditer ou répondre à ma question si cela a aidé ou non. –

Répondre

2

Je pense que votre approche en utilisant les lignes et trouver le maximum est probablement plus facile. Le seul problème que vous avez est de distinguer les deux principaux maxima. Pour cela, vous pouvez appliquer un lissage grossier, pour trouver le milieu entre les deux maxima (ligne bleue dans l'image ci-dessous). Vous pouvez alors seulement prendre le bit le plus bas, qui est celui qui vous intéresse et trouver le maximum de ce bit. Dans une dernière étape, additionnez simplement les deux indices.

Résultat: enter image description here

pourrait se présenter comme suit:

ib = imread('LHkm2.png'); %Read image 
sz = size(ib);    %get dimensions 
for i = 1:sz(2) 
    [~, ind_mid(i)] = max(smooth(-double(ib(:, i)), 130));%First round 
    line_to_smooth = ib(ind_mid(i):end, i);%Get line with one maximum 
    [~, ind(i)] = min(smooth(double(line_to_smooth), 10));%Second round 
    ind(i) = ind(i) + ind_mid(i);%Add indices to get final position 
end 
imshow(ib,[]); 
hold on; 
plot(ind_mid, 'LineWidth', 3); 
plot(ind, 'LineWidth', 3); 

Note: Vous pouvez bien sûr lisser la dernière ligne comme tous les autres graphiques pour se débarrasser des bosses comme ceci:

ind = smooth(ind, 10) 

où 10 est votre fenêtre de lissage (plus le plus large est large, voir here.

+0

Merci pour la solution facile mais bonne. Je l'ai essayé sur d'autres images et la ligne semble convenir très bien, mais pouvez-vous m'expliquer comment lisser la dernière ligne s'il vous plait? –