[英]How to program an image filter using Color lookup table in Nokia Imaging SDK
我有幾個看起來像這樣的顏色查找表。 我是否可以使用諾基亞成像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或CustomEffectBase基類將使您幾乎直接轉換此循環。
我不確定單獨使用此RGB LUT是否會獲得更好的性能或准確性,因為它已經非常簡單了。 我看到的主要內容是GetPixel / SetPixel,您實際上應該將其更改為直接數組訪問。 還要避免使用Color類。 理想情況下,讀取和寫入32位uint值,掩蓋和移出部件。
第二個改進是可以限制存儲在LUT中的功能。
如果可以將其表示為單獨的紅色,綠色和藍色LUT,則可以使用Imaging SDK中的CurvesFilter類。 即使沒有SDK,也可以加快速度,因為這些表可以更靠近L1或L2緩存中的CPU。
編輯:諾基亞影像SDK 1.2的最終版本(即將發布)具有一些可能也與之相關的精度改進,順便說一句。
編輯2:您應該可以使用以下內容訪問Pixel。 (尚未完全測試演員表。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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.