2009-07-02 4 views
1

메모리에 8bppIndexed 그레이 스케일 이미지를로드하고 픽셀 값을 읽습니다. 문제는 픽셀에서 얻은 값이 실제 이미지와 일치하지 않는 것처럼 보이며 항상 더 어둡습니다. 내 이미지는 이런 단순한 그레이 구배 : 하부 우측 픽셀 (191)을 리턴하고, 위쪽 왼쪽 실제로 64 및 하부 오른쪽 여기 255C#의 비트 맵 이미지에 회색조 문제가 있습니다.

이다 0. 왼쪽

alt text

이미지를로드하는 방법 :

Bitmap threshImg = new Bitmap(@"C:\grey.bmp"); 

PixelFormat을 검사하면 Format8bppIndexed에 있음을 확인합니다. 그래서 오른쪽 아래 픽셀을 읽고 상단과 같이 왼쪽 :

BitmapData data = threshImg.LockBits(new Rectangle(0, 0, rectWidth, rectHeight), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); 
unsafe 
{ 
    byte* pixel = (byte*)data.Scan0.ToPointer(); 
    int topVal = (int)(byte)pixel[0]; 
    int bottomVal = (int)(byte)pixel[((threshImg.Height * threshImg.Width)) - 1]; 
} 
threshImg.UnlockBits(data); 

을 내가 24bppRbg로 이미지를 변환 (그리고 그에 따라 코드를 조정) 나는 각각의 모서리에 정확한 색상 값을 참조하십시오.

8bppIndexed 이미지를 사용할 때 왜 더 어두운 값을 얻는 지 알 수 있습니다.

답변

3

8bpp 색인 이미지의 값은 색인 자체가 아니라 색상 자체 (또는 회색 값)입니다. 색상 표에서 색상 값을 찾으십시오.

+0

색상 팔레트를보고 색인이 올바른 색상과 일치했습니다. 필자는 팔레트가 256 색을 포함하는 그레이 스케일의 고른 분포라고 가정했지만 인덱스 192의 검은 색 64 색의 범위가 실제로 존재했습니다 :-) – badbod99

1

색인 된 이미지에는 특정 수의 색상 만 사용할 수 있습니다 (이 경우 회색 음영). 일반적으로 256입니다. 원본 이미지의 전체 음영을 얻는 데 충분하지 않을 가능성이 큽니다.

정확한 음영을 갖는 것이 중요하므로 24bpp 이미지로 이동합니다.

+0

+1 : 스케일링 문제가 될 것 같습니다. –

+0

원본 이미지가 8bpp 형식으로 저장되었습니다. 우리는 8bpp로 설정된 그레이 스케일 비디오 카메라를 사용하여 높은 프레임 속도의 1394a 버스 대역폭 내에서 유지하므로 원본 이미지는이 형식이어야합니다. – badbod99