La acción `compareImages` se utiliza para evaluar la similitud o diferencia entre dos conjuntos de imágenes. Compara las imágenes de una tabla de origen con las de una tabla de referencia utilizando métricas específicas como el Índice de Similitud Estructural (SSIM) o la Relación Señal-Ruido de Pico (PSNR). Esta acción es fundamental para tareas como la detección de cambios, la verificación de la calidad de la imagen o la búsqueda de imágenes duplicadas.
| Parámetro | Descripción |
|---|---|
| casOut | Especifica la tabla de salida para almacenar los resultados de la comparación. Es un parámetro obligatorio. |
| referenceImages | Especifica la tabla que contiene las imágenes de referencia para la comparación. Es un parámetro obligatorio. |
| sourceImages | Especifica la tabla que contiene las imágenes de origen a comparar. Es un parámetro obligatorio. |
| copyVars | Especifica una lista de variables para copiar de la tabla de entrada a la tabla de salida. |
| maximum | Especifica el valor máximo de comparación a reportar. Las comparaciones con un valor superior no se incluirán en la salida. |
| method | Especifica el método de comparación de imágenes. 'PSNR' para Peak Signal-to-Noise Ratio o 'SSIM' para Structural Similarity Index. El valor predeterminado es 'SSIM'. |
| minimum | Especifica el valor mínimo de comparación a reportar. Las comparaciones con un valor inferior no se incluirán en la salida. |
| pairAll | Si se establece en True, compara cada imagen de la tabla de origen con cada imagen de la tabla de referencia. Predeterminado es False. |
| pairOnPath | Si se establece en True, indica que las variables de emparejamiento son rutas de archivo. Predeterminado es True. |
| pairReferenceOn | Especifica el nombre de la columna en la tabla de imágenes de referencia que se utilizará para el emparejamiento. |
| pairSourceOn | Especifica el nombre de la columna en la tabla de imágenes de origen que se utilizará para el emparejamiento. |
| separateChannels | Si se establece en True, la comparación se realiza por separado para cada canal de color de la imagen. Predeterminado es True. |
Para ilustrar el uso de la acción `compareImages`, primero cargamos dos tablas en CAS: una con imágenes de origen y otra con imágenes de referencia. Estas tablas contienen una columna `_path_` que especifica la ubicación de los archivos de imagen. Asumimos que las imágenes ya existen en una ruta accesible desde el servidor CAS.
| 1 | PROC CAS; |
| 2 | /* Crear tabla de imágenes de origen */ |
| 3 | DATA casuser.source_images; |
| 4 | LENGTH _path_ $200; |
| 5 | INFILE DATALINES dsd; |
| 6 | INPUT _path_ $; |
| 7 | DATALINES; |
| 8 | /img/original/image1.png |
| 9 | /img/original/image2.jpg |
| 10 | ; |
| 11 | RUN; |
| 12 | |
| 13 | /* Crear tabla de imágenes de referencia */ |
| 14 | DATA casuser.reference_images; |
| 15 | LENGTH _path_ $200; |
| 16 | INFILE DATALINES dsd; |
| 17 | INPUT _path_ $; |
| 18 | DATALINES; |
| 19 | /img/reference/image1.png |
| 20 | /img/reference/image2.jpg |
| 21 | ; |
| 22 | RUN; |
| 23 | |
| 24 | /* Cargar las imágenes en las tablas CAS */ |
| 25 | image.loadImages / |
| 26 | path="/img/original/" |
| 27 | casout={name="source_images_loaded", caslib="casuser", replace=true}; |
| 28 | RUN; |
| 29 | |
| 30 | image.loadImages / |
| 31 | path="/img/reference/" |
| 32 | casout={name="reference_images_loaded", caslib="casuser", replace=true}; |
| 33 | RUN; |
| 34 | QUIT; |
Este ejemplo compara imágenes entre dos tablas basándose en la coincidencia de la columna `_path_`. Utiliza el método por defecto, Índice de Similitud Estructural (SSIM), para medir qué tan parecidas son las imágenes.
| 1 | |
| 2 | PROC CAS; |
| 3 | image.compareImages / TABLE={name='source_images_loaded', caslib='casuser'}, referenceImages={TABLE={name='reference_images_loaded', caslib='casuser'}}, casOut={name='comparisons_ssim', caslib='casuser', replace=true}; |
| 4 | |
| 5 | RUN; |
| 6 | |
| 7 | QUIT; |
| 8 |
Este ejemplo realiza una comparación de 'todos contra todos' (`pairAll=True`) entre las imágenes de las dos tablas. Utiliza el método PSNR (Peak Signal-to-Noise Ratio) y solo muestra en la salida los pares de imágenes cuya puntuación PSNR esté entre 30 y 100, lo que ayuda a filtrar resultados de baja calidad o ruido.
| 1 | |
| 2 | PROC CAS; |
| 3 | image.compareImages / TABLE={name='source_images_loaded', caslib='casuser'}, referenceImages={TABLE={name='reference_images_loaded', caslib='casuser'}}, method='PSNR', pairAll=true, minimum=30, maximum=100, casOut={name='comparisons_psnr_all', caslib='casuser', replace=true}; |
| 4 | |
| 5 | RUN; |
| 6 | |
| 7 | QUIT; |
| 8 |
En este caso, las imágenes se emparejan utilizando una columna de identificación personalizada llamada 'image_id' en lugar de la ruta del archivo. Además, la comparación SSIM se realiza en la imagen completa en lugar de por canales separados (`separateChannels=False`), lo que puede ser más rápido pero menos granular.
| 1 | |
| 2 | PROC CAS; |
| 3 | image.compareImages / TABLE={name='source_images_loaded', caslib='casuser'}, referenceImages={TABLE={name='reference_images_loaded', caslib='casuser'}}, pairSourceOn='image_id', pairReferenceOn='image_id', separateChannels=false, casOut={name='comparisons_ssim_by_id', caslib='casuser', replace=true}; |
| 4 | |
| 5 | RUN; |
| 6 | |
| 7 | QUIT; |
| 8 |