個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證PWA de campo para realce de arte rupestre: doce filtros de decorrelación que corren enteros en el navegador, sin conexión
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Realce de arte rupestre en el campo. Doce filtros de decorrelación —el mismo motor que la versión de escritorio— sobre fotos o sobre la cámara en vivo, con selección de zona y reportes PDF con EXIF y GPS.
Es una PWA: se instala en el celular o la tablet y, después de la primera
visita, funciona entera sin conexión. Todo el procesamiento ocurre en el
dispositivo sobre canvas; no hay servidor, no se sube ninguna imagen a ningún
lado y no hace falta señal para trabajar.
App: https://emilios81.github.io/opuntia-movil/ Versión de escritorio: https://emilios81.github.io/opuntiacolor/
No está en Google Play ni en la App Store, y no hay que descargar ningún archivo: se abre el enlace y se instala desde el menú del propio navegador.
Antes de salir al campo: abrila una vez con señal y dejá que cargue del todo. Esa primera visita es la que guarda la aplicación en el equipo; a partir de ahí funciona entera sin conexión.
Android (Chrome)
iPhone y iPad (Safari)
En Chrome o Edge de escritorio aparece un ícono de instalar al final de la barra de direcciones, pero en la computadora conviene usar la versión de escritorio, que es más completa.
La primera vez que se abre la cámara En vivo el equipo pide permiso para
usarla; hace falta solo para ese modo. Si no aparece la opción de instalar, verificar que
la dirección empiece con https://: la cámara y la instalación requieren HTTPS.
Aun sin instalarla, la app funciona abriéndola en el navegador.
npm run verificar.No cambia ningún resultado. La salida de los doce filtros es la de v3.7.0, byte a byte. Es el mismo arreglo de la versión de escritorio 3.7.1.
npm run verificar funciona contra el escritorio actual. Desde su 3.7.1
la web guarda esa tabla en una constante nueva, y desde su 3.7.3 calcula el
tamaño de trabajo con otra función; la prueba lee las dos formas, y también
las de antes. Sigue dando 407 comparaciones: 397 idénticas y las 10 de la
imagen plana, que no cuentan.Desde esta versión la móvil ya no sigue la numeración ni los cambios de la
versión de escritorio. Cada tanda sigue subiendo el último número, pero el del
medio deja de indicar con qué versión de la web está alineada: eso lo dice
npm run verificar. Lo de la web llega a la móvil solo cuando se decide
portarlo.
Cambian los resultados del Rojo, y los del Bicromo y el Micro-relieve en los colores muy saturados. Los tres cambios de filtros son los de la versión de escritorio 3.7.0, que salieron de la correspondencia con B. Gunn; acá se portan con la misma aritmética y la salida coincide byte a byte.
npm run verificar comparaba solo los cuatro filtros de decorrelación.
En vivo se corrigió lo mismo.npm run verificar compara los doce filtros, el Relieve también con
escala y sobre un panel grande con gradiente de luz: 407 comparaciones,
idénticas byte a byte. Las únicas distintas son las de una imagen totalmente
plana en Blanco y Negro, una entrada degenerada que la prueba informa pero no
cuenta. npm run verificar-gpu: 224 comparaciones dentro de tolerancia.IMG_0421_OPC_relief_i1.5_e0.25_c10.png). Hasta ahora llevaba solo el
filtro. El reporte PDF agrega la escala.Para reproducir una imagen hecha con el Rojo, el Bicromo o el Micro-relieve de v3.6.2, hay que usar esa versión (DOI 10.5281/zenodo.23147164).
No cambia ningún resultado. El motor y el tamaño de trabajo no se tocaron:
npm run verificar sigue dando las 142 comparaciones idénticas.
Desde esta versión, el número del medio acompaña al de la versión de escritorio con la que la móvil está alineada (3.6.x ↔ escritorio 3.6.0), y cada tanda de cambios sube el último. Por eso la versión anterior, que estuvo publicada unas horas como 3.7.0, pasó a llamarse 3.6.1. Si una tanda cambia resultados, se avisa en su sección, en negrita, como en v3.6.1.
Estuvo publicada unas horas como 3.7.0 y se renumeró: ver la numeración en v3.6.2.
Cambia los resultados con los valores por defecto. Hasta v3.6.0 toda foto se achicaba a 2000 px de lado antes de procesarla. Ahora se procesa a su resolución real, como hace el escritorio desde su v3.6.0. Micro-relieve, Relieve y CLAHE dependen de la escala, así que lo procesado con v3.6.0 o anteriores no es comparable sin reprocesar. Para reproducirlo, elegir 2000 px: con esa opción el cálculo es el mismo de antes y la salida, idéntica.
Con el tope de 2000 px la misma foto daba un resultado en el celular y otro en la computadora, y se perdía lo que justifica tener dos versiones: que el dato no dependa del aparato. Además el modo en vivo filma en 4K, pero Capturar achicaba el cuadro a 2000 px antes de analizarlo.
El escritorio llega a 8192 px y el celular a 4096. Se midió cuánta memoria pide el motor según el tamaño de la foto. Los filtros de decorrelación (CRGB, DS-LAB y LDS) son los que más piden, unos 52 bytes por píxel:
| Foto | Píxeles | Pico de memoria medido |
|---|---|---|
| 2000 × 1500 (el tope anterior) | 3 MP | ~200 MB |
| 4032 × 3024 (celular típico) | 12 MP | ~700 MB |
| 5712 × 4284 (iPhone 15 en adelante) | 24 MP | ~1,35 GB |
| 8160 × 6120 (modo de 50 MP) | 50 MP | ~2,7 GB |
Pasado el giga, lo más probable es que el sistema del celular cierre la pestaña. Con 4096 px entran enteras las fotos de 12 MP, que es lo que guarda por defecto la mayoría de los celulares, y las capturas 4K del modo en vivo. Para esas fotos el tamaño de trabajo es el mismo que en el escritorio y la salida coincide byte a byte. Una foto más grande se reduce a 4096 px y el panel lo avisa en rojo; para procesarla entera está el escritorio.
Las explicaciones de los paneles (Fijar colores, Reducción de ruido, Selección, Acumular…) pasan de 9 a 10,5 px, y otros rótulos chicos suben un punto: en el celular no se leían.
npm run verificar suma la comparación del tamaño de trabajo contra
computeSize del escritorio: son 142 comparaciones, todas idénticas. El motor de
filtros no se tocó.
No cambia ningún resultado de las fotos. El motor de referencia
(src/lib/image-processing.ts) no se tocó, y npm run verificar sigue dando las
100 comparaciones idénticas byte a byte con el escritorio.
Lo que cambia es el modo en vivo, que además deja de llamarse Live.
Hasta v3.5.0 cada cuadro pasaba por el mismo motor que las fotos: JavaScript en el procesador, un píxel detrás de otro. Para que el video no se arrastrara había que achicarlo a 480 o 720 px de ancho, y en un visor que ocupa media pantalla de celular las dos opciones quedaban prácticamente del tamaño de la pantalla: no había diferencia que ver. Además la decorrelación amplifica el granulado de color del sensor, y en video ese ruido estaba siempre a la vista.
Si el equipo no tiene WebGL2 con texturas flotantes, el modo en vivo sigue funcionando como antes, en la CPU, a 720 px como máximo.
La GPU calcula en precisión simple y, en vivo, las estadísticas de la
decorrelación salen de una muestra de unos 130.000 píxeles del cuadro, tomada a
intervalos regulares de la grilla. npm run verificar-gpu mide la diferencia con
el motor de referencia sobre imágenes sintéticas de hasta 4K, filtro por filtro:
Alcanza y sobra para explorar en pantalla, pero no es igualdad byte a byte. Por eso el registro sale de Capturar, que procesa el cuadro con el motor de referencia: el mismo resultado que daría el escritorio sobre esa imagen.
Cambia los resultados de LDS. Las imágenes procesadas con v3.4.0 o anteriores no son reproducibles con esta versión: para compararlas hay que reprocesarlas. Los demás filtros no se tocaron.
Hasta v3.4.0 la normalización final de LDS tomaba el mínimo y el máximo absolutos de cada canal, y de ahí salían dos defectos encadenados:
Ahora el rango sale de las vallas de Tukey (Q1 − 3·IQR, Q3 + 3·IQR), que
no se mueven por más extremo que sea un objeto del encuadre, y la salida se arma
con una ganancia y un desplazamiento comunes a los tres canales, de modo que
el orden de los canales no puede invertirse.
Es el mismo cambio que la versión de escritorio introdujo en su v3.5.0; acá está
portado y verificado byte a byte con npm run verificar.
Junto con lo anterior, CRGB, DS-LAB, LDS e YBK pasaron a calcularse en
Float64Array donde antes usaban Float32Array, que es lo que hace el
escritorio. Sobre valores fraccionarios —L*a*b*, Y/Cb/Cr, componentes
principales— el error de ~1e-5 de la simple precisión alcanzaba para que algún
píxel cayera del otro lado del redondeo final.
El efecto es mínimo pero no es nulo: sobre el juego de pruebas cambia 1 byte de cada 297.920 (0,0003%), y siempre en 1 nivel. CRGB no cambia en absoluto, porque parte de valores enteros. No invalida material publicado —a diferencia del cambio de LDS de más arriba—, pero conviene consignarlo.
Lo que sí destraba es la comparación: con esto npm run verificar da las 100
comparaciones idénticas byte a byte. Un nivel en un píxel suelto no cambia
ninguna lectura arqueológica, pero rompía la única garantía de que una foto
procesada en el celular y otra en la computadora sean exactamente el mismo dato.
npm install
npm run dev # http://localhost:9002
npm run build # sitio estático en out/
npm run verificar # compara el motor contra la versión de escritorio
npm run verificar-gpu # compara el motor en vivo (GPU) contra el de referencia
npm run verificar compila src/lib/image-processing.ts y corre sus filtros y
los de ../OpuntiaColor/src/app.jsx sobre las mismas imágenes sintéticas,
comparando byte a byte. También compara el tamaño de trabajo de las fotos
(src/lib/resolucion.ts) con el que calcula el escritorio. Son dos
implementaciones distintas —TypeScript contra JSX—, así que la alineación no se
ve leyendo el código. Toda modificación del
motor tiene que pasar por ahí antes de publicar: si las dos apps divergen, dos
fotos del mismo panel dan resultados distintos según el aparato y el dato deja de
ser comparable. Si el proyecto de escritorio está en otra carpeta:
node tests/comparar-con-escritorio.js "D:/ruta/OpuntiaColor/src/app.jsx"
npm run verificar-gpu no termina solo: compila los dos motores, los sirve en
http://localhost:9013 y deja una página para abrir en un navegador con WebGL2,
que corre los doce filtros en la GPU y en el motor de referencia y muestra cuánto
se apartan. Toda modificación de live-shaders.ts, live-stats.ts o
live-gpu.ts tiene que pasar por ahí.
El motor de filtros está en src/lib/image-processing.ts y la interfaz en
src/app/page.tsx. No hay servidor: todo el procesamiento ocurre en el
navegador, sobre canvas las fotos y sobre WebGL2 el video en vivo.
Cada push a main dispara .github/workflows/deploy.yml, que compila y publica
en GitHub Pages. En Settings → Pages del repositorio, Source tiene que
estar en GitHub Actions.
El sitio vive en una subcarpeta (/opuntia-movil/), definida por basePath en
next.config.ts. Si se publica en la raíz de un dominio propio, compilar con
NEXT_PUBLIC_BASE_PATH="".
La cámara y la instalación como app requieren HTTPS. GitHub Pages lo provee; abrir el sitio por IP de red local (http://) deja la cámara en vivo sin funcionar.
src/lib/image-processing.ts motor de los doce filtros (el de referencia)
src/lib/resolucion.ts tamaño de trabajo de las fotos (el cálculo del escritorio)
src/lib/idioma.ts español e inglés: tr(es, en), la misma convención del escritorio
src/lib/version.ts la versión, en un solo lugar para todo el código
src/lib/live-shaders.ts los doce filtros portados a la GPU (GLSL)
src/lib/live-stats.ts estadísticas del video en vivo, con el mismo motor
src/lib/live-gpu.ts motor en vivo: cuadros, ruido, filtros y pantalla
src/lib/exif-utils.ts lectura de EXIF y GPS
src/lib/pdf-report.ts armado del reporte
src/app/page.tsx interfaz completa
src/components/ visor en vivo, CompareSlider, registro de la PWA
src/components/ui/ los ocho componentes de shadcn que se usan
public/sw.js service worker (el que da el modo offline)
tests/ las dos verificaciones contra el motor de referencia
El proyecto nació de un andamiaje de Firebase Studio que arrastraba Firestore, Auth, flujos de genkit y treinta y tantos componentes de shadcn que nunca se usaron. Nada de eso quedó: la app no habla con ninguna red en tiempo de ejecución, y las dependencias son solo las que el código importa de verdad.
GPL-3.0-or-later, la misma que la versión de escritorio: esta app porta su motor de filtros, así que es obra derivada y comparte licencia. Ver LICENSE.
Si la usás en una publicación, citá el DOI de concepto, que resuelve siempre a la última versión:
Los DOI de cada versión son: v3.4.0 10.5281/zenodo.21845134, v3.5.0 10.5281/zenodo.22145677 y v3.6.2 10.5281/zenodo.23147164. La v3.6.2 cubre también la 3.6.0 y la 3.6.1, que no tienen DOI propio: la 3.6.0 da las mismas fotos que la 3.5.0, y la 3.6.1 las mismas que la 3.6.2. Los datos completos de cita están en CITATION.cff, y GitHub los ofrece ya formateados en el botón Cite this repository.
El depósito declara isDerivedFrom sobre
10.5281/zenodo.21796290, el DOI del
proyecto de escritorio del que porta el motor.
La intensidad significa cosas distintas en cada filtro y no es comparable entre ellos: al publicar resultados hay que consignar el filtro y la intensidad. En LDS la intensidad es el exponente de blanqueo γ = intensidad / 1.5, de modo que el valor por defecto (1.5) reproduce exactamente la salida de v3.3.0.
Dr. Emilio A. Villafañez · LATDAA · Fund. Félix de Azara · Universidad Nacional de Catamarca (UNCA), Argentina