Désolé, je ne connais pas OpenCV, et c'est plus une étape de prétraitement qu'une réponse complète:
Tout d'abord, vous ne voulez pas de détecteur de bord. Un détecteur de bord convertit les transitions (comme ce sombre-clair):
dans des crêtes (lignes claires sur sombres) comme ceci:
Il effectue une différenciation, en d'autres termes.
Mais dans vos images, il y a une lumière qui brille dans une direction, ce qui nous montre le relief de la surface 3D. Nous percevons cela comme des lignes et des bords, parce que nous sommes habitués à voir des choses en 3D, mais ils ne le sont pas vraiment, c'est pourquoi les détecteurs de bords ne fonctionnent pas, et la correspondance des modèles ne fonctionnera pas facilement avec des images pivotées (un parfait une correspondance à 0 degrés entraînerait une annulation totale à 180 degrés, car la lumière et l'obscurité s'aligneraient).
Si la hauteur de l'une de ces lignes labyrinthiques ressemble à ceci de côté:
alors la fonction de luminosité lorsqu'elle est éclairée d'un côté ressemblera à ceci:
C'est ce que vous voyez dans vos images. La surface en regard devient plus claire et la surface arrière devient plus sombre. Vous ne voulez donc pas faire de différence. Vous devez intégrer l'image le long de la direction de l'illumination, et cela vous donnera la carte de la hauteur d'origine de la surface (approximativement). Ensuite, il sera plus facile de faire correspondre les choses, que ce soit via la transformation de Hough ou la correspondance de modèles ou autre.
Je ne sais pas comment automatiser la recherche de la direction de l'éclairage. Si c'est la même chose pour toutes vos images, tant mieux. Sinon, vous devez trouver la plus grande ligne de contraste et supposer que la lumière est perpendiculaire à elle ou quelque chose. Pour mon exemple, j'ai fait pivoter l'image manuellement dans ce que je pensais être la bonne direction, avec une lumière venant de la gauche:
Cependant, vous devez également supprimer tous les changements de basse fréquence dans l'image, pour ne mettre en évidence que les caractéristiques de type ligne qui changent rapidement. Pour éviter les artefacts de sonnerie, j'ai utilisé un flou gaussien 2D, puis je l'ai soustrait de l'original:
L'intégration (somme cumulée) peut s'emballer facilement, ce qui produit des stries horizontales. Je les ai supprimés avec un autre passe-haut gaussien, mais seulement dans le sens horizontal cette fois:
Maintenant, les stomates sont des ellipses blanches tout autour, au lieu du blanc à certains endroits et du noir à d'autres.
Original:
Intégré:
from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d
filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)
# Remove DC offset
I = I - average(I)
close('all')
figure()
imshow(I)
gray()
show()
title('Original')
# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)
figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)
# Integrate
summed = cumsum(I, 1)
# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)
figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)
La transformée de Hough peut être utilisée pour détecter des ellipses de crête comme celle-ci, constituées de "pixels de bord", bien que cela soit vraiment coûteux en calcul et en mémoire, et ce ne sont pas des ellipses parfaites, donc il faudrait que ce soit un peu un détecteur "bâclé". Je ne l'ai jamais fait, mais il existe de nombreux résultats Google pour la " détection des ellipses ". Je dirais que si vous détectez une ellipse à l'intérieur de l'autre, dans un espace de recherche d'une certaine taille, elle devrait être considérée comme une stomie.
Regarde aussi: