que productos machine learning control computer artificial image matlab image-processing computer-vision matlab-cvst

image - productos - Coincidencia de imágenes con diferentes orientaciones y escalas en MATLAB



vision artificial matlab (4)

Tengo dos imágenes que son similares pero que difieren en orientación y tamaño. Un ejemplo se puede ver a continuación:

¿Hay alguna manera de unir las dos imágenes?

He utilizado el análisis de forma de Procrustes, pero ¿hay otras formas?



Puede obtener un resultado razonable haciendo lo siguiente:

  • Detecta puntos SIFT en ambas imágenes. Por ejemplo, con vlfeat lib.
  • Coincidencia de descriptores SIFT utilizando la regla de Lowe, implementada por vlfeat con vl_ubcmatch
  • Use RANSAC para buscar un subconjunto de puntos coincidentes que se adhieran a alguna homografía H. Se puede ver un ejemplo usando los puntos de la característica de Harris en el sitio de Peter Kovesi , al lado de RANSAC y otras funciones útiles.

El resultado inicial:


Este es un enfoque bastante diferente al resto. Los métodos de registro basados ​​en funciones son más sólidos, pero mi enfoque puede ser útil para su aplicación, así que lo escribo aquí.

  • Cargue la imagen de referencia (lo llamaré modelo) y la imagen que desea comparar con el modelo
  • Calcule los histogramas de las dos imágenes
  • Compara los dos histogramas. Hay muchas maneras de hacer esto. Aquí usaré la intersección y la correlación
  • Intersección del histograma: calcule la intersección del histograma y normalícela dividiéndola por el número de píxeles en el histograma del modelo. Esto le dará un valor entre 0 y 1.

    image = imread(''Pd7pt.png''); model = imread(''vXqe8.png''); grImage = rgb2gray(image); grModel = rgb2gray(model); hImage = imhist(grImage); hModel = imhist(grModel); normhistInterMeasure = sum(min(hImage, hModel))/sum(hModel) corrMeasure = corr2(hImage, hModel)

  • Para la intersección y la correlación obtengo 0.2492 y 0.9999 respectivamente.


Aquí hay algo para que comiences. Lo que está pidiendo es un problema clásico conocido como registro de imágenes . El registro de imágenes busca encontrar la homografía correcta que toma una imagen y la alinea con otra. Esto implica encontrar interés o puntos clave que son comunes entre las dos imágenes y determinar qué puntos clave coinciden entre las dos imágenes. Una vez que tienes estos pares de puntos, determinas una matriz de homografía y deformas una de las imágenes para que estén alineadas con la otra con esta matriz.

Voy a suponer que tienes las cajas de herramientas de visión artificial y procesamiento de imágenes que son parte de MATLAB. Si no lo hace, entonces la respuesta que dio Maurits es una buena alternativa, y VLFeat Toolbox es una que también he usado.

Primero, vamos a leer en las imágenes directamente de :

im = imread(''http://i.stack.imgur.com/vXqe8.png''); im2 = imread(''http://i.stack.imgur.com/Pd7pt.png''); im_gray = rgb2gray(im); im2_gray = rgb2gray(im2);

También necesitamos convertir a escala de grises ya que los algoritmos de detección de puntos clave requieren una imagen en escala de grises. A continuación, podemos utilizar cualquier algoritmo de detección de características que sea parte del CVST de MATLAB ... Voy a usar SURF ya que es esencialmente lo mismo que SIFT, pero con algunas diferencias menores pero clave. Puede usar la función detectSURFFeatures que forma parte de la caja de herramientas CVST y acepta imágenes en escala de grises. El resultado es una estructura que contiene un montón de información sobre cada punto de característica que el algoritmo detectó para la imagen. Vamos a aplicar eso a ambas imágenes (en escala de grises).

points = detectSURFFeatures(im_gray); points2 = detectSURFFeatures(im2_gray);

Una vez que detectamos las características, es el momento de extraer los descriptores que describen estos puntos clave. Eso se puede hacer con extractFeatures . Esto toma una imagen en escala de grises y la estructura correspondiente que fue emitida desde detectSURFFeatures . La salida es un conjunto de características y puntos clave válidos después de un poco de procesamiento posterior.

[features1, validPoints1] = extractFeatures(im_gray, points); [features2, validPoints2] = extractFeatures(im2_gray, points2);

Ahora es el momento de combinar las características entre las dos imágenes. Eso se puede hacer con matchFeatures y toma en las características entre las dos imágenes:

indexPairs = matchFeatures(features1, features2);

indexPairs es una matriz 2D en la que la primera columna le indica qué punto de la primera imagen coincide con los de la segunda imagen, almacenada en la segunda columna. Lo usaríamos para indexar nuestros puntos válidos para dar cuerpo a lo que realmente coincide.

matchedPoints1 = validPoints1(indexPairs(:, 1), :); matchedPoints2 = validPoints2(indexPairs(:, 2), :);

A continuación, podemos mostrar qué puntos coinciden utilizando showMatchedFeatures como tal. Podemos poner ambas imágenes una al lado de la otra y dibujar líneas entre los puntos clave correspondientes para ver cuál coincide.

figure; showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, ''montage'');

Esto es lo que obtengo:

No es perfecto, pero ciertamente encuentra coincidencias consistentes entre las dos imágenes.

Ahora lo que tenemos que hacer a continuación es encontrar la matriz de homografía y deformar las imágenes. Voy a utilizar estimateGeometricTransform para que podamos encontrar una transformación que comba un conjunto de puntos a otro. Como Dima notó en sus comentarios a continuación, esto determina con firmeza la mejor matriz de homografía a través de RANSAC. Podemos llamar a estimateGeometricTransform así:

tform = estimateGeometricTransform(matchedPoints1.Location,... matchedPoints2.Location, ''projective'');

La primera entrada toma un conjunto de puntos de entrada , que son los puntos que debe transformar. La segunda entrada toma un conjunto de puntos base que son los puntos de referencia . Estos puntos son lo que queremos hacer coincidir.

En nuestro caso, queremos deformar los puntos de la primera imagen, la persona que está de pie y hacer que coincida con la segunda imagen, la persona inclinada sobre su costado, y entonces la primera entrada son los puntos de la primera imagen, y la segunda la entrada es los puntos de la segunda imagen.

Para los puntos coincidentes, queremos hacer referencia al campo Location porque estos contienen las coordenadas de donde coinciden los puntos reales entre las dos imágenes. También usamos projective para dar cuenta de la escala, corte y rotación. El resultado es una estructura que contiene nuestra transformación de puntos.

Lo que haremos a continuación es usar imwarp para deformar la primera imagen para que se alinee con la segunda.

out = imwarp(im, tform);

out contendrá nuestra imagen deformada. Si mostramos la segunda imagen y esta imagen de salida una al lado de la otra:

figure; subplot(1,2,1); imshow(im2); subplot(1,2,2); imshow(out);

Esto es lo que obtenemos:

Yo diría que es bastante bueno, ¿no crees?

Para su placer de copiar y pegar, así es como se ve el código completo:

im = imread(''http://i.stack.imgur.com/vXqe8.png''); im2 = imread(''http://i.stack.imgur.com/Pd7pt.png''); im_gray = rgb2gray(im); im2_gray = rgb2gray(im2); points = detectSURFFeatures(im_gray); points2 = detectSURFFeatures(im2_gray); [features1, validPoints1] = extractFeatures(im_gray, points); [features2, validPoints2] = extractFeatures(im2_gray, points2); indexPairs = matchFeatures(features1, features2); matchedPoints1 = validPoints1(indexPairs(:, 1), :); matchedPoints2 = validPoints2(indexPairs(:, 2), :); figure; showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, ''montage''); tform = estimateGeometricTransform(matchedPoints1.Location,... matchedPoints2.Location, ''projective''); out = imwarp(im, tform); figure; subplot(1,2,1); imshow(im2); subplot(1,2,2); imshow(out);

Aparte

Tenga en cuenta que utilicé los parámetros predeterminados para todo ... para detectSURFFeatures matchFeatures detectSURFFeatures , las características de matchFeatures , etc. Puede que tenga que jugar con los parámetros para obtener resultados uniformes en los diferentes pares de imágenes que prueba. Te lo dejo como ejercicio. Eche un vistazo a todos los enlaces que he vinculado anteriormente con respecto a cada una de las funciones para que pueda jugar con los parámetros que se adapten a sus gustos.

¡Diviértete y buena suerte!