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?
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?