Come programmare un filtro immagine utilizzando la tabella di ricerca a colori in Nokia Imaging SDK
-
26-12-2019 - |
Domanda
Ho alcune tabelle di ricerca a colori che sembrano .Esiste una guida che posso utilizzare per programmare un filtro dell'immagine utilizzando la tabella di ricerca colore in Nokia Imaging SDK.Sto passando a Nokia Imaging SDK perché mi è stato detto che è più ottimizzato e preciso.
Attualmente il codice sembra questo.
public WriteableBitmap Process()
{
int width = inputimage.PixelWidth;
int height = inputimage.PixelHeight;
int[] pixelArray = this.inputimage.Pixels;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
// Extract color components
var c = inputimage.GetPixel(i,j);
var b = c.B;
var g = c.G;
var r = c.R;
var a = c.A;
int blockBlue = b / 4;
int blockGreen = g / 4;
int blockRed = r / 4;
int right = blockBlue % 8;
int down = blockBlue / 8;
int px = right * 64 + blockRed;
int py = down * 64 + blockGreen;
Color clr = LookUpTable.GetPixel(px, py);
// Set result color
inputimage.SetPixel(i, j, clr);
}
}
return wBmp;
}
. Soluzione
Le classi di base personalizzateFasi o personalizzate Personalizzato ti permetteranno di tradurre questo ciclo quasi direttamente.
Non sono sicuro se riceverai prestazioni o accuratezza migliori per questo RGB Lut da solo, come è già piuttosto semplice. Le cose principali che vedo sono il getpixel / setpixel che dovresti davvero passare agli accessi ad array diretta. Evitare anche la classe di colori. Idealmente letto e scrivi valori di UINT a 32 bit, maschera e spostano le parti.
Il secondo miglioramento sarebbe se è possibile vincolare la funzione memorizzata nel LUT.
Se può essere espresso come singolo rosso, verde e blu LUTS, è possibile utilizzare la classe CurvesFilter nell'immagine SDK. Anche senza SDK questo accelererà le cose come quelle tabelle possono vivere più vicino alla CPU nella cache L1 o L2.
Modifica: la versione finale di Nokia Imaging SDK 1.2 (da rilasciare presto) ha alcuni miglioramenti di precisione che potrebbero essere rilevanti anche, a BTW.
Modifica 2: dovresti essere in grado di accedere a pixel con qualcosa come il seguente. (Non ho testato completamente i cast. C # è pignolo su firmato-ness.)
// in for loop..
var uintColor = (uint)wb.Pixels[i];
var a = (byte)((uintColor >> 24) & 255);
var r = (byte)((uintColor >> 16) & 255);
var g = (byte)((uintColor >> 8) & 255);
var b = (byte)((uintColor) & 255);
// ..do something..
wb.Pixels[i] = (int)(b | (g << 8) | (r << 16) | (a << 24));
.