[c++] Ridimensionamento e rotazione dell'immagine in C / C ++



Answers

Esistono molti modi per ridimensionare e ruotare le immagini. Il modo più semplice per ridimensionare è:

dest[dx,dy] = src[dx*src_width/dest_width,dy*src_height/dest_height]

ma questo produce effetti di blocco quando si aumentano le dimensioni e la perdita di dettagli quando si riduce la dimensione. Esistono modi per produrre risultati migliori, ad esempio il filtro bilineare .

Per la rotazione, la posizione del pixel src può essere calcolata usando una matrice di rotazione :

sx,sy = M(dx,dy)

dove M è una matrice che mappa i pixel di destinazione nell'immagine sorgente. Di nuovo, dovrai eseguire l'interpolazione per produrre risultati non di blocco.

Ma ci sono un sacco di librerie disponibili se non vuoi entrare nella matematica dell'elaborazione delle immagini.

Question

Qual è il modo migliore per scalare un array di immagini 2D? Ad esempio, supponiamo di avere un'immagine di 1024 x 2048 byte, con ogni byte come un pixel. Ogni pixel è un livello di scala di grigi da 0 a 255. Mi piacerebbe essere in grado di ridimensionare questa immagine con un fattore arbitrario e ottenere una nuova immagine. Quindi, se ridimensiono l'immagine di un fattore di 0,68, dovrei ottenere una nuova immagine di dimensione 0,68 * 1024 x 0,68 * 2048. alcuni pixel saranno collassati l'uno sull'altro. E, se scala di un fattore di dire 3.15, otterrei un'immagine più grande con i pixel duplicati. Quindi, qual è il modo migliore per farlo?

Successivamente, mi piacerebbe essere in grado di ruotare un'immagine con un angolo arbitrario, nell'intervallo da 0 a 360 gradi (0 - 2Pi). Il ritaglio dell'immagine dopo la rotazione non è un problema. Quale sarebbe il modo migliore per farlo?




Scopri Intel Performance Primitives . L'ho usato prima e produce prestazioni quasi ottimali su x86. C'è anche un programma di test che consente di giocare con i vari algoritmi.




Vuoi fare il lavoro sporco da solo o puoi farlo ImageMagick per te?




CxImage è una libreria gratuita per la gestione delle immagini, che può fare ciò che vuoi. Non l'ho usato personalmente tranne che per cose banali, ma l'ho visto raccomandato ripetutamente.




I metodi di ridimensionamento CxImage producono risultati strani. Ho usato le funzioni Resample e Resample2 con tutte le varianti disponibili dei metodi di interpolazione con lo stesso risultato. Ad esempio, prova a ridimensionare l'immagine 1024 x 768 riempita con il colore bianco fino alla dimensione 802 x 582. Scoprirai che ci sono dei pixel sull'immagine che hanno un colore diverso dal bianco! Puoi verificarlo: apri l'immagine ridimensionata in Windows Paint e prova a riempirla di nero. Il risultato ti divertirà sicuramente.




Related