このコマンドを 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);
uint8
(符号なし8ビット)として保存されている画像のピクセルに対して操作を実行しています。
ピクセルを 64 で割ると、基本的に値を 6 (!) ビットだけ右にシフトします。つまり、ピクセルごとに最上位ビットを 2 (1) だけ残します。64 を乗算すると、最下位 6 ビットがゼロで埋められ、データが失われます。
以下に少し例を示します。
>> a = uint8(153); dec2bin(a)
ans =
0b10011001
>> b = a/64; dec2bin(b)
ans =
0b00000010
右側の 6 ビット ( 011001
) がすべてなくなっていることに注意してください。左から 2 ビット ( 10
) だけが残ります (右にシフトされます)。この除算操作により、データが失われました。
さて、逆に乗算します:
>> c = b*64; dec2bin(c)
ans =
0b10000000
右側の 6 ビットはすべて0
! 以前の値011001
はなくなりました!
Rodyによる別の例:
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')