2013-07-02 3 views
0

이 명령을 MATLAB에서 사용하면 이미지가 왜곡되어 유지되지 않습니다. 이게 왜 그렇게?결과가 왜곡되지 않은 이유는 무엇입니까?

>> b = imread('eight.tif'); 
>> b2 = imdivide(b,64); 
>> bb2 = immultiply(b2,64); 
>> imshow(bb2) 
>> imshow(b); 
+0

이 사진을 재현 할 수 없으며 여기에서 잘 작동합니다 (명백한 색상 변경은 제외) ... 어떻게 든 사진을 업로드 할 수 있습니까? –

+0

"왜곡 된"이란 무엇을 의미합니까? – Shai

+0

'b'가'uint8' 배열이면? 나는 b의 모든 요소에 대해 대응하는 64 개의 'b2'요소가 0이 될 것이고 정수 연산으로 인해 'bb2'요소도 될 것이라고 생각한다. – anandr

답변

2

이다. 0에서 255 사이의 값 범위를 갖는 이미지를 64로 나눌 때, 0, 1, 2, 3, 4 값을 갖는 이미지로 끝날 것입니다. 다시 곱하면 0, 64가됩니다. , 128, 192 및 255가 표시됩니다.

이것을 확인하십시오 : imshow(b/64*64). 이것은 당신에게 같은 유물을 보여줄 것입니다.

이제 이것을 확인하십시오 : imshow(uint8(double(b)/64*64)). 원본 이미지가 표시됩니다. 이 작업은 uint8이 아니라 double에서 수행되기 때문에이 값을 복구 할 수 있습니다.

+0

Btw, 당신은'unique (b (:))'를 사용할 수있다. 이것은'b' 매트릭스에있는 모든 유일한 값들을 나열 할 것이고, 그것은 당신이 무엇이 바뀌 었는지 조사하는 것을 도울 수 있습니다. – Diana

3

당신은 uint8 (부호없는 8 비트)로서 저장 이미지의 픽셀에 대한 작업을 수행한다.
픽셀을 64로 나누면 기본적으로 6 (!) 비트만큼 오른쪽으로 값이 이동합니다. 즉, 픽셀 당 2 (1) 개의 최상위 비트 만 남겨 둡니다. 64로 다시 곱하는 것은 6 개의 최하위 비트를 0으로 채운다 - 데이터가 손실된다.. 오른쪽에있는 모든 6 비트 (011001)이 사라 방법

>> a = uint8(153); dec2bin(a) 
ans = 
0b10011001 
>> b = a/64;  dec2bin(b) 
ans = 
0b00000010 

참고 :


여기에 약간의 예입니다! 왼쪽에서 두 비트() 만 남습니다 (오른쪽으로 이동). 이 분할 작업으로 인해 데이터가 손실되었습니다 ().
이제 다시 곱 :

>> c = b*64;  dec2bin(c) 
ans = 
0b10000000 

모든 6 개 비트를 오른쪽에 0는 지금! 이전 값은 011001입니다. Rody에 의해


또 다른 exampe : 당신은 UINT8 이미지를 분할하기 때문에

data = uint8(1:255); 

figure(1), clf, hold on 

plot(data, data, 'b') 
plot(data, data/uint8(64)*uint8(64), 'r') 

xlabel('Original Values') 
ylabel('Ouptut values') 

axis tight 
legend('Original color space', 'Color space after integer division/multiply',... 
    'Location', 'NorthWest') 

enter image description here

+0

그래,이게 무슨 일이 일어날 지 상상해 보았지만, "왜곡되어"모양, 크기 및/또는 비율이 바뀌 었다고 생각했는데 ... 글쎄, 어쨌든 +1. :) –

+0

나는 그것을 얻지 못했다. Layman 용어로 설명해주세요. – user75736

+0

@ user75736 정확히 이해 못하겠습니까? 'uint8' 데이터 타입에 익숙합니까? – Shai

관련 문제