2011-02-11 17 views
9

Tengo un problema como el que se ve debajo, el de arriba es la imagen original, el de la parte inferior está inclinado 90 grados hacia la izquierda. ¿Hay alguna manera de calcular el cambio de ángulo? He intentado la Transformada de Hough, puedo detectar la ubicación, sin embargo, no puedo detectar el ángel que ha cambiado. ¿Hay una alternativa para detectar los grados cambiados?Comparando la imagen en cuántos grados inclinados

enter image description here

enter image description here

+0

¿Cómo lo arreglo? Nunca me di cuenta de esto. – user288231

+0

Tienes que elegir la mejor respuesta marcándola. –

+0

... asumiendo que realmente resuelve tu problema – Justin

Respuesta

5

he hecho esto antes de usar un filtro simétrico de fase sólo comparable. En realidad, fue para el reconocimiento de huellas digitales, lo que permite la rotación y la escala. Desafortunadamente, es bastante complicado. Debe sentirse cómodo con la forma de calcular una FFT y con un nivel similar de matemáticas. No lo hice en C#, sino en MATLAB (y en el sintetizable Verilog, pero esa es otra historia). Yo recomendaría usar MATLAB o un paquete matemático similar primero para asegurarme de que tienes el algoritmo correcto.

Afortunadamente, alguien ya ha implementado este algoritmo en una biblioteca de procesamiento de imágenes .NET en alguna parte.

El papel que utilicé fue el siguiente. Está más basado en las matemáticas que en el algoritmo, por lo que se necesitará algo de trabajo para convertirlo en código:

Qin-Sheng Chen; Defrise, M .; Deconinck, F. "Symmetric phase-only matched filtering of Fourier-Mellin transforms for image registration and recognition," análisis de patrones e inteligencia de máquina de , IEEE Transacciones en , vol.16, no.12, pp.1156-1168, diciembre de 1994

Resumen: presenta un nuevo método para hacer coincidir una imagen 2D con una imagen de referencia rotada y escalada traducida. El enfoque consta de dos pasos: el cálculo de un descriptor de Fourier-Mellin invariante (FMI) para cada imagen con el que se debe hacer coincidir, y el correspondiente de los descriptores de FMI. El descriptor FMI es invariante de traducción, y representa la rotación y la escala como traducciones en el espacio de parámetros. La coincidencia de los descriptores de FMI es lograda mediante el filtrado simétrico de fase solo (SPOMF). El rendimiento de del algoritmo FMI-SPOMF es el mismo o similar al del filtro combinado de fase cuando trata las traducciones de imágenes. La ventaja significativa de de la nueva técnica es su capacidad de emparejar imágenes giradas y escaladas exactamente y de manera eficiente. La innovación es la aplicación de SPOMF a los descriptores FMI , lo que garantiza un alto poder discriminante y una excelente robustez de en presencia de ruido. Este documento describe el principio de el nuevo método y su implementación discreta para problemas de detección de imagen o problemas de registro de imagen .Prácticos resultados se presentan para diferentes aplicaciones en formación de imágenes médicas, teledetección, huella digital reconocimiento y multiobjeto identificación

+0

Estoy dispuesto a probarlo con Matlab, pero soy nuevo en él. ¿Te importa proporcionar cualquier documento o bibliotecas para ayudarme? Gracias .. – user288231

+0

@ user288231 - De hecho, he perdido todos mis documentos/código para esto. Fue hace unos años en la escuela y realmente nunca lo vi tan importante. Tengo suerte de recordar lo suficiente como para encontrar el periódico ... ¡Lo siento! El documento de IEEE al que me he vinculado es decente (sin embargo, debes ser miembro). – Justin

0

También puede girar segunda imagen en un bucle por ángulo constante y calcular RMSE entre dos imágenes en cada iteración. El ángulo de coincidencia será donde RMSE sea mínimo.

Aquí es powershell script que implementa esta idea con ImageMagick:

# convert images to equal sizes for pixel by pixel comparision 
convert.exe p1.png -resize 73x73! p1.png 
convert.exe p2.png -resize 73x73! p2.png 

# initialize variables 
$min_rmse = 1.0 
$degrees_rotated = -1.0 

# rotate second image by 10 degrees in each iteration 
# and after that measure RMSE between first image and second rotated image 
for ($i=0; $i -le 350; $i+=10) { 
    convert.exe p2.png -rotate $i tmp.png 
    convert.exe tmp.png -resize 73x73! tmp.png 
    $rmse = compare.exe -metric rmse p1.png tmp.png diff.png 2>&1 
    $rmse = ([string] $rmse).split(" ")[1] 
    $rmse = $rmse.replace("(","") 
    $rmse = [double] $rmse.replace(")","") 

    # find rotation angle where RMSE is minimal 
    if ($rmse -lt $min_rmse) { 
     $min_rmse = $rmse 
     $degrees_rotated = $i 
    } 
} 

Write-Host "two images are most similar when second image is rotated by $degrees_rotated deg (rmse is $min_rmse)" 
Write-Host "Press any key to exit ..." 
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 

Espero que ayude.
p.s. Según el wiki RMSE entre dos vectores se puede calcular de dos maneras diferentes. No sé cuál se implementa en ImageMagick como comando

compare.exe -metric rmse
, pero con seguridad esto puede determinarse preguntando a los desarrolladores de IM o por el método de prueba y error.

Cuestiones relacionadas