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
Respuesta
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
Estoy dispuesto a probarlo con Matlab, pero soy nuevo en él. ¿Te importa proporcionar cualquier documento o bibliotecas para ayudarme? Gracias .. – user288231
@ 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
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.
- 1. Imagen numpy - girar la matriz 270 grados
- 2. Detener la rotación de la imagen después de 360 grados
- 3. Writeablebitmap.SaveJpeg está girando mi imagen -90 grados
- 4. Cómo rotar una imagen 90 grados en iOS?
- 5. Comparando UIImage
- 6. ¿Hay alguna forma de averiguar cuántos grados se rotan actualmente durante una animación?
- 7. ¿Cómo rotar la imagen mediante programación en 90 grados en iPhone?
- 8. Canvas HTML5: ¿Cómo hacer una rueda giratoria de carga girando la imagen en grados?
- 9. Comparando cadenas en EL
- 10. comparando cadenas en bash
- 11. Comparando listas en Lisp
- 12. comparando cadena con la enumeración
- 13. comparando cadenas en vb
- 14. Comparando referencias en Java
- 15. Grados de consulta de separación
- 16. comparando dos imágenes vectoriales
- 17. Convertir de Grados decimales a Grados Minutos Segundos décimas.
- 18. ¿La manera más fácil de girar 90 grados una imagen usando OpenCV?
- 19. Comparando dobles
- 20. ¿Cuántos elementos habrá en la matriz?
- 21. UIImagePNGR ¿Problemas con la presentación?/Imágenes giradas 90 grados
- 22. UIImage Rotation grados personalizados
- 23. Comparando valores dobles en C#
- 24. Comparando dos matrices en Matlab
- 25. NSNumbers Comparando en Objective C
- 26. imagen presionada desde el iPhone en el modo vertical se gira 90 grados
- 27. Comparando dos listas en Python
- 28. Comparando rango en una enumeración
- 29. Símbolo de grados (como en grados Celsius/Fahrenheit) en un TextView
- 30. Lossless JPEG ¿Girar (90/180/270 grados) en Java?
¿Cómo lo arreglo? Nunca me di cuenta de esto. – user288231
Tienes que elegir la mejor respuesta marcándola. –
... asumiendo que realmente resuelve tu problema – Justin