如何使用诺基亚映像SDK中的颜色查找表编写图像过滤器
-
26-12-2019 - |
题
我有一些颜色查找表,看起来像 。是否有指南,我可以使用诺基亚成像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));
. 不隶属于 StackOverflow