Nokia Imaging SDK의 컬러 룩업 테이블을 사용하여 이미지 필터를 프로그래밍하는 방법

StackOverflow https://stackoverflow.com//questions/24058366

문제

처럼 보이는 몇 가지 색상 조회 테이블이 있습니다.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));
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top