【发布时间】:2011-03-10 02:45:37
【问题描述】:
有没有办法使位旋转操作可逆?我的意思是,如果有图像 X(大小 256 * 256 *3),那么在进行位旋转时,将获得图像 Y。然后对Y进行位旋转,我们得到图像X。另外,如何解决位溢出,以免信息丢失。
【问题讨论】:
-
旋转不会丢失信息,它只是移动它。
标签: matlab
有没有办法使位旋转操作可逆?我的意思是,如果有图像 X(大小 256 * 256 *3),那么在进行位旋转时,将获得图像 Y。然后对Y进行位旋转,我们得到图像X。另外,如何解决位溢出,以免信息丢失。
【问题讨论】:
标签: matlab
更新:我已将我在下面发布的代码改进为 a complete function,其中包含错误检查、帮助文档以及对无符号整数数组进行操作的能力和 双精度变量就像相关的内置函数BITSHIFT。我建议使用我在上面链接到的较新版本,而不是下面发布的旧版本。
MATLAB 没有内置的位循环函数,BITSHIFT 函数会丢弃溢出的位。但是,您可以基于existing bit operations 实现自己的位旋转功能。这是我拼凑的一个简单的第一次通过版本(没有错误检查):
function data = bit_rotate(data,nBits)
dataBits = log2(double(intmax(class(data)))+1); %# Number of bits in data
nBits = rem(nBits,dataBits); %# No need to rotate by dataBits bits or more
if nBits == 0 %# No bit rotation needed, just return
return
end
shiftedData = bitshift(data,nBits); %# Bit shift the data
lostData = bitxor(data,bitshift(shiftedData,-nBits)); %# Find the lost bits
rotatedData = bitshift(lostData,nBits-sign(nBits)*dataBits); %# Rotate them
data = shiftedData+rotatedData; %# Add the rotated bits to the shifted bits
end
还有一些测试数据:
>> B = uint8(208); %# An unsigned 8-bit integer value
>> disp(dec2bin(B,8)) %# Display the bit pattern of B
11010000
>> disp(dec2bin(bit_rotate(B,2),8)) %# Rotate left by 2 bits
01000011
>> disp(dec2bin(bit_rotate(B,-2),8)) %# Rotate right by 2 bits
00110100
请注意,bit_rotate 也可以对 data 的任何大小的矩阵输入进行操作,只要它是无符号整数类型即可。
【讨论】:
img = imread('cameraman.tif'); rotimg = bit_rotate(img,2); figure; imshow(rotimg); recimg = bit_rotate(rotimg,-2); figure; imshow(recimg);
当然,位旋转是可逆的,只需反向旋转相同的量即可。
Wikipedia 提供了有关如何在 C 中使用基本位移位来实现它的很好的信息,这样您就不会溢出: http://en.wikipedia.org/wiki/Circular_shift
而且我想如果这个操作在 Matlab 中被称为“位旋转”,它肯定不会溢出。
【讨论】: