[Problema] Algoritmo di scaling e resampling di immagini

Stato
Discussione chiusa ad ulteriori risposte.

imported_BlackLight

Utente Silver
16 Agosto 2007
211
8
1
98
Sto lavorando da un po' a un OCR che attraverso una rete neurale riconosce i caratteri in un testo qualsiasi salvato come immagine. Il tutto funziona decentemente, ma ovviamente non potendo addestrare la rete neurale con i caratteri di tutte le dimensioni possibili mi limito ad addestrarla con i caratteri di una dimensione prefissata, e se vengono incontrati nell'immagine caratteri di dimensioni maggiori o minori questi vengono scalati alla dimensione per cui la rete neurale è addestrata.

E qui arriva il problema: come operare lo scaling? Come libreria per la gestione delle immagini uso ImageMagick che ha già un metodo built-in per lo scaling delle immagini, ma ovviamente opera sull'oggetto "immagine", cosa che io non voglio (voglio scalare i singoli caratteri all'interno dell'immagine presi come matrici, non l'intera immagine), quindi l'algoritmo dovrò scrivermelo io.

Il problema non è tanto lo scaling in sé (per quello uso un'interpolazione bicubica, o un nearest-neighbor con filtro di Lanczos), ma il passo prima. Tutti i metodi di interpolazione mi consentono di avere uno scaling 2x, 4x, 8x ecc. nel caso in cui io voglia scalare l'immagine a una dimensione maggiore (divisione dell'immagine, per dire, in rettangoli 2x2, applico l'interpolazione bicubica a ogni rettangolo, ricavo i coefficienti e la funzione di interpolazione e scalo ogni singolo rettangolo a uno 1x1, 3x3, 4x4, 5x5 ecc.). Volendo potrei calcolare la spline bicubica per tutta l'immagine invece che dividerla in quadrati, in modo da calcolare i valori della funzione per le coppie (x,y) che voglio io, ma già con un quadrato 2x2 ho 16 equazioni lineari in 16 incognite, con uno 100x100 la CPU verrebbe fritta. Quindi come faccio?
 
Sinceramente non credo di aver compreso quale sia il problema che vuoi risolvere.
Comunque un sistema lineare 16x16 non malcondizionato non è computazionalmente costoso (<0.01s), almeno non credo che lo sia per quello per cui lo stai usando.
 
Beh una spline bicubica su un quadrato 2x2 si riporta a 16 equazioni in 16 incognite...se lo applichi per una matrice 100x100 diventano qualcosa come qualche milione di equazioni, e quello è un problema.
 
ma hai detto che puoi dividere in quadrati, o quella soluzione comunque non è fattibile?

:EDIT:
sto rivedendo un po di appunti: riguardo alla spline cubica (che ovviamente non è quella che usi tu), la matrice dei coefficienti è tridiagonale (predominanza diagonale forte) [edit]se non sbaglio anche simmetrica[/edit]. In queste condizioni, la matrice credo possa essere anche considerata sparsa e quindi dovrebbe essere fattibile anche una risoluzione di sistemi con un numero elevato di equazioni (il che forse non significa che puoi farla di tutta l'immagine ma di quadrati maggiori di 2x2).

Da verificare che questo valga anche per le bicubiche

:EDIT2: con gauss per la risoluzione di sistemi 40*40 ci vuole, se implementato bene, 2*13*10^(-4) secondi (secondo ciò che mi è stato detto dal mio professore di calcolo numerico). Comunque quello è l'ordine

:EDIT3:
potresti usare il metodo di jacobi o di gauss seidel (o comunque metodi iterativi)
 
Stato
Discussione chiusa ad ulteriori risposte.