我有一些颜色查找表,看起来像 。是否有指南,我可以使用诺基亚成像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;
    }
.

有帮助吗?

解决方案

CustomFilterBase或CoreMeFfectBase基类将允许您直接翻译此循环。

我不确定是否会对这个RGB LUT获得任何更好的性能或准确性,因为它已经很简单。我看到的主要事情是GetPixel / setPixel,您真的应该改变为直接数组访问。还避免了颜色课程。理想地读写32位UINT值,掩码并偏移零件。

如果您可以约束存储在LUT中的函数,则将是第二个改进。

如果它可以表示为单独的红色,绿色和蓝色LUT,您可以使用成像SDK中的曲线滤波器类。即使没有SDK,这将速度加速,因为这些表可以在L1或L2缓存中更接近CPU。

编辑:最终版本的诺基亚映像SDK 1.2(很快被释放)具有一些可能与之相关的精确改进,BTW。

编辑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));
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top