1

我有几个看起来像这样的颜色查找表。是否有指南可用于使用诺基亚成像 SDK 中的颜色查找表对图像过滤器进行编程。我正在切换到诺基亚成像 SDK,因为我被告知它更加优化和准确。

目前代码看起来像这样。

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

1 回答 1

1

CustomFilterBase 或 CustomEffectBase 基类将让您几乎直接翻译此循环。

我不确定单独使用这个 RGB LUT 是否会获得更好的性能或准确性,因为它已经非常简单了。我看到的主要内容是 GetPixel/SetPixel,您确实应该将其更改为直接数组访问。还要避免使用 Color 类。理想情况下读取和写入 32 位 uint 值,屏蔽并移出部分。

第二个改进是您可以限制存储在 LUT 中的函数。

如果可以表示为单独的红色、绿色和蓝色 LUT,则可以使用 Imaging SDK 中的 CurvesFilter 类。即使没有 SDK,这也会加快速度,因为这些表可以在 L1 或 L2 缓存中更靠近 CPU。

编辑:诺基亚 Imaging SDK 1.2 的最终版本(即将发布)具有一些可能相关的精度改进,顺便说一句。

编辑 2:您应该能够使用以下内容访问像素。(还没有完全测试演员表。C# 对签名很挑剔。)

// 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));
于 2014-06-05T16:42:06.240 回答