Comment programmer un filtre d'image à l'aide de la table de recherche de couleurs dans Nokia Imaging SDK

StackOverflow https://stackoverflow.com//questions/24058366

Question

J'ai quelques tables de recherche de couleurs qui ressemble à Ceci .Y a-t-il un guide que je peux utiliser pour programmer un filtre d'image à l'aide de la table de recherche de couleurs dans Nokia Imaging SDK.Je passe à Nokia Imaging SDK car on m'a dit qu'il est plus optimisé et plus précis.

Actuellement, le code ressemble à ceci.

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;
    }

Était-ce utile?

La solution

Les classes de base CustomFilterTerBase ou CustomeffectBase vous permettront de traduire cette boucle presque directement.

Je ne suis pas sûr que vous obtiendrez une meilleure performance ou une meilleure précision pour ce seul lut rgb, car il est déjà assez simple. Les principales choses que je vois sont la getpixel / SetPixel que vous devriez vraiment passer aux accès directs des array. Évitez également la classe de couleur. Idéalement lu et écrire des valeurs d'uint 32 bits, masquer et déplacer les pièces.

La deuxième amélioration serait si vous pouvez contraindre la fonction stockée dans le lut.

Si cela peut être exprimé sous forme de luts rouges, verts et bleus individuels, vous pouvez utiliser la classe CurvesFilter dans l'imagerie SDK. Même sans le SDK, cela accélérera les choses que ces tables peuvent être plus proches de la CPU dans le cache L1 ou L2.

EDIT: La version finale de Nokia Imaging SDK 1.2 (prochainement être publiée) a des améliorations de précision pouvant être pertinentes, BTW.

Edit 2: Vous devriez être capable d'accéder à des pixels avec quelque chose comme ce qui suit. (N'a pas testé complètement les moulages. C # est difficile à propos de la signature-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));

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top