Nokia Imaging SDK의 컬러 룩업 테이블을 사용하여 이미지 필터를 프로그래밍하는 방법
-
26-12-2019 - |
문제
이 처럼 보이는 몇 가지 색상 조회 테이블이 있습니다.Nokia Imaging SDK의 컬러 룩업 테이블을 사용하여 이미지 필터를 프로그래밍하는 데 사용할 수있는 가이드가 있습니까?나는 그것이 더욱 최적화되고 정확하다는 것을 말했기 때문에 Nokia Imaging 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만이 이미 꽤 간단 하므로이 RGB LUT에 대한 더 나은 성능이나 정확성을 얻을 수 있는지 확실하지 않습니다. 내가 보는 주요 사항은 대신 직접 배열 액세스로 변경 해야하는 GetPixel / setpixel입니다. 또한 컬러 클래스를 피하십시오. 32 비트 uint 값을 읽고 쓰고, 마스크 및 파트를 옮기십시오.
두 번째 개선은 LUT에 저장된 기능을 제한 할 수있는 경우입니다.
개별 적색, 녹색 및 청색 LUTS로 표현할 수있는 경우 이미징 SDK에서 CURVEFILTER 클래스를 사용할 수 있습니다. SDK가없는 경우 에도이 테이블이 L1 또는 L2 캐시의 CPU에 더 가깝게 살 수 있으므로 속도가 빨라집니다.
편집 : Nokia Imaging 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));
.