2015-01-25 3 views
-5

그레이 스케일을 12 비트에서 8 비트로 변환하는 알고리즘을 만들려고합니다. 규모가 매트릭스에 표시됩니다MATLAB 그레이 스케일 12 비트에서 8 비트

enter image description here

:

나는 이와 같은 그레이 스케일을 얻었다. 문제는 1/16의 간단한 곱셈이 첫 번째 회색 열을 파괴한다는 것입니다. 여기

Codeexample :

in =[ 
    1 1 1 3 3 3 15 15 15 63 63 63; 
    1 1 1 3 3 3 15 15 15 63 63 63; 
    1 1 1 3 3 3 15 15 15 63 63 63; 
    1 1 1 3 3 3 15 15 15 63 63 63 
]; 
[zeilen spalten] = size(in); 

eight = round(in/16); 
imshow(uint8(eight)); 

은 뉴 열 당신이 (12)에 대응 가능한 최대 강도에 의해 모든 단일 요소를 나눌 수 있도록 지금

+0

"파괴"란 무엇을 의미합니까? – Jake0x32

+1

12 비트에서 8 비트로 또는 그 반대로? 당신의 제목은 한 가지를 말하고 질문은 그 반대를 말합니다. –

+0

죄송합니다. 내 실수입니다. 12 ~ 8 – CrimsonKing

답변

2

간단히 이미지 크기를 조정하는 블랙 것으로, 평균 파괴 비트 (또는 2^12 - 1 = 4095) 부호없는 정수를 곱한 다음 8 비트 부호없는 정수 (또는 2^8 - 1 = 255)에 해당하는 최대 가능한 강도를 곱하십시오. 따라서

는 :

out = uint8((255.0/4095.0)*(double(in))); 

당신은 당신이 이미지 유형은 8 비트로 보장 그래서 uint8에 캐스트 다음이 스케일링을 수행 할 때 부동 소수점 정밀도 및 유지 관리하도록 double으로 캐스팅해야합니다. 이 스케일링 팩터는 대략 (1/16) (255.0/4095.0 ~ 1/16부터)이라고 독창적으로 추론했습니다. 그러나 12 비트 이미지의 경우 1과 3의 밝기가 너무 작아 동등한 8 비트 형식으로 표현할 수 없으므로 테스트 이미지의 출력에는 처음 6 개의 열이 반드시 있어야합니다. 당신이 당신의 12 비트 이미지가 모든 16 강도 증가, 그것에 대해 생각하는 경우 0으로 내림, 이것은 8 비트 이미지에 대한 동등한 하나의 강도 증가로 등록, 또는 :

12-bit --> 8-bit 
    0 --> 0 
    15 --> 1 
    31 --> 2 
    47 --> 3 
    63 --> 4 
    ... --> ... 
    4095 --> 255 

1과 3의 값이 다음 단계로 넘어갈만큼 높지 않으므로 0으로 반올림됩니다. 그러나 15의 값은 1에 매핑되고 63의 값은 4에 매핑됩니다. 테스트 입력에서 위의 코드를 실행할 때 기대하십시오.

관련 문제