Lo siento, no conozco OpenCV, y este es más un paso de preprocesamiento que una respuesta completa:
Primero, no quieres un detector de bordes. Un detector de bordes convierte las transiciones (como esta de oscuro a claro):
en crestas (líneas brillantes en la oscuridad) así
Realiza una diferenciación, en otras palabras.
Pero en sus imágenes, hay una luz que brilla desde una dirección, lo que nos muestra el alivio de la superficie 3D. Percibimos esto como líneas y bordes, porque estamos acostumbrados a ver cosas en 3D, pero en realidad no lo son, por eso los detectores de bordes no funcionan, y la coincidencia de plantillas no funcionará fácilmente con imágenes rotadas (un perfecto la coincidencia a 0 grados de rotación en realidad se cancelaría completamente a 180 grados, porque la luz y la oscuridad se alinearían entre sí
Si la altura de una de estas líneas mazy se ve así desde el lado:
entonces la función de brillo cuando se ilumina desde un lado se verá así:
Esto es lo que ves en tus imágenes. La superficie frontal se vuelve más brillante y la superficie posterior se vuelve más oscura. Entonces no quieres diferenciar. Debe integrar la imagen a lo largo de la dirección de la iluminación, y le dará el mapa de altura original de la superficie (aproximadamente). Entonces será más fácil hacer coincidir cosas, ya sea a través de la transformación de Hough o la coincidencia de plantillas o lo que sea.
No estoy seguro de cómo automatizar la búsqueda de la dirección de la iluminación. Si es lo mismo para todas tus imágenes, genial. De lo contrario, tendría que encontrar la línea de contraste más grande y asumir que la luz es perpendicular a ella o algo así. Para mi ejemplo, roté la imagen manualmente a lo que pensé que era la dirección correcta, con luz proveniente de la izquierda:
Sin embargo, también debe eliminar todos los cambios de baja frecuencia en la imagen para resaltar solo las características similares a líneas que cambian rápidamente. Para evitar que suenen los artefactos, utilicé el desenfoque gaussiano en 2D y luego lo resté del original:
La integración (suma acumulativa) puede escaparse fácilmente, lo que produce rayas horizontales. Los eliminé con otro paso alto gaussiano, pero esta vez solo en dirección horizontal:
Ahora los estomas son elipses blancas, en lugar de blanco en algunos lugares y negro en otros.
Original:
Integrado:
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 transformación de Hough se puede usar para detectar elipses de cresta como esta, hechas de "píxeles de borde", aunque es realmente costosa en computación y memoria, y no son elipses perfectas, por lo que tendría que ser un poco un detector "descuidado". Nunca lo he hecho, pero hay muchos resultados de Google para " detección de elipse hough ". Diría que si detecta una elipse dentro de la otra, dentro de un espacio de búsqueda de cierto tamaño, debe contarse como un estoma.
Ver también: