이 명령을 MATLAB에서 사용하면 이미지가 왜곡되어 유지되지 않습니다. 이게 왜 그렇게?결과가 왜곡되지 않은 이유는 무엇입니까?
>> b = imread('eight.tif');
>> b2 = imdivide(b,64);
>> bb2 = immultiply(b2,64);
>> imshow(bb2)
>> imshow(b);
이 명령을 MATLAB에서 사용하면 이미지가 왜곡되어 유지되지 않습니다. 이게 왜 그렇게?결과가 왜곡되지 않은 이유는 무엇입니까?
>> b = imread('eight.tif');
>> b2 = imdivide(b,64);
>> bb2 = immultiply(b2,64);
>> imshow(bb2)
>> imshow(b);
이다. 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에서 수행되기 때문에이 값을 복구 할 수 있습니다.
Btw, 당신은'unique (b (:))'를 사용할 수있다. 이것은'b' 매트릭스에있는 모든 유일한 값들을 나열 할 것이고, 그것은 당신이 무엇이 바뀌 었는지 조사하는 것을 도울 수 있습니다. – Diana
당신은 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')
이 사진을 재현 할 수 없으며 여기에서 잘 작동합니다 (명백한 색상 변경은 제외) ... 어떻게 든 사진을 업로드 할 수 있습니까? –
"왜곡 된"이란 무엇을 의미합니까? – Shai
'b'가'uint8' 배열이면? 나는 b의 모든 요소에 대해 대응하는 64 개의 'b2'요소가 0이 될 것이고 정수 연산으로 인해 'bb2'요소도 될 것이라고 생각한다. – anandr